Commit de5c7ab4 authored by Danny SMc's avatar Danny SMc

Added credits, help, updates, app store, and added better plugin support, with...

Added credits, help, updates, app store, and added better plugin support, with icon libraries and menu entries as well as being able to run complete different programs.
parent 8883dffb
--[[
Name: Example Plugin
Desc: A basic example plugin
Auth: DannySMc
]]
-- @base example
-- @func entry
--// Create plugin namespace
Plugin.example = {};
--// Create init function
function Plugin.example.entry()
base.screen.colour("lightBlue")
base.draw.textc("Initialising Example Plugin", 9, false, "white", "lightBlue")
sleep(1)
local exampleicon = {
{"c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: "};
{"c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: "};
{"c:c: ","c:c: ","f:3:M","c:c: ","f:3:n","c:c: ","f:3:g","f:3:e","f:3:m","f:3:e","f:3:n","f:3:t","c:c: ","c:c: "};
{"c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: ","c:c: "};
};
--// Will add the menu icon into the existing icon library
DiscoverApp.Register.MenuIcon("ExamplePlugin", exampleicon);
--// Will register a menu entry
DiscoverApp.Register.MenuEntry("ExamplePlugin", "example", "new", "NewEx", false);
end
--// Create actual function
function program.example.new()
base.screen.colour("lightBlue")
base.draw.textc("Nice one! Example plugin is now usable", 10, false, "white", "lightBlue");
while true do
local args = { os.pullEvent() }
if args[1] == "timer" then
program.draw.menubar("Example")
elseif args[1] == "mouse_click" then
if args[4] >= 1 and args[4] <= 2 then
program.draw.menu.handler("Example", args[3], args[4])
end
end
end
end
\ No newline at end of file
function program.account.manage()
base.screen.colour("white")
program.draw.menubar("My Account")
local function run()
for i=1, 20 do
base.draw.box(i, 1, 3, 17, " ", "lightGrey", "lightGrey")
end
base.draw.box(2, 18, 5, 1, " ", "orange", "orange")
base.draw.box(2, 18, 7, 1, " ", "orange", "orange")
base.draw.box(2, 18, 9, 1, " ", "orange", "orange")
base.draw.box(2, 18, 11, 1, " ", "orange", "orange")
base.draw.box(2, 18, 13, 1, " ", "orange", "orange")
base.draw.box(2, 18, 15, 1, " ", "orange", "orange")
base.draw.box(2, 18, 17, 1, " ", "orange", "orange")
base.draw.texta("Upload an App", 3, 5, false, "white", "orange")
base.draw.texta("Update an App", 3, 7, false, "white", "orange")
base.draw.texta("View my Apps", 3, 9, false, "white", "orange")
base.draw.texta("Notifications", 3, 11, false, "white", "orange")
base.draw.texta("Change Password", 3, 13, false, "white", "orange")
base.draw.texta("Change Email", 3, 15, false, "white", "orange")
base.draw.texta("My Statistics", 3, 17, false, "white", "orange")
-- Draw info
base.draw.texta("My Details", 31, 4, false, "grey", "white")
base.draw.texta("Username:", 22, 7, false, "lightGrey", "white")
base.draw.box(22, 29, 8, 1, " ", "cyan", "cyan")
base.draw.texta(tostring(Discover.User:GetField("Username")), 23, 8, false, "white", "cyan")
base.draw.texta("AuthKey:", 22, 11, false, "lightGrey", "white")
base.draw.box(22, 29, 12, 1, " ", "cyan", "cyan")
base.draw.box(22, 29, 13, 1, " ", "cyan", "cyan")
base.draw.box(22, 29, 14, 1, " ", "cyan", "cyan")
base.draw.box(22, 29, 15, 1, " ", "cyan", "cyan")
base.draw.box(22, 29, 16, 1, " ", "cyan", "cyan")
local authkey = Discover.User:GetField("AuthKey")
base.draw.texta(authkey:sub(1, 27) , 23, 12, false, "white", "cyan")
base.draw.texta(authkey:sub(28, 54) , 23, 13, false, "white", "cyan")
base.draw.texta(authkey:sub(55, 81) , 23, 14, false, "white", "cyan")
base.draw.texta(authkey:sub(82, 108) , 23, 15, false, "white", "cyan")
base.draw.texta(authkey:sub(109) , 23, 16, false, "white", "cyan")
end
run()
while true do
local args = { os.pullEvent() }
if args[1] == "timer" then
program.draw.menubar("My Account")
elseif args[1] == "mouse_click" then
if args[4] >= 1 and args[4] <= 2 then
program.draw.menu.handler("Account", args[3], args[4])
elseif (args[3] >= 2 and args[3] <= 18) and (args[4] == 5) then
if not base.thread.find("Upload") then
base.thread.create("Upload", program.apps.upload)
end
base.thread.switch("Upload")
elseif (args[3] >= 2 and args[3] <= 18) and (args[4] == 7) then
if not base.thread.find("Update") then
base.thread.create("Update", program.apps.update)
end
base.thread.switch("Update")
elseif (args[3] >= 2 and args[3] <= 18) and (args[4] == 9) then
if not base.thread.find("MyApps") then
base.thread.create("MyApps", program.apps.owned)
end
base.thread.switch("MyApps")
elseif (args[3] >= 2 and args[3] <= 18) and (args[4] == 11) then
if not base.thread.find("Notifications") then
base.thread.create("Notifications", program.main.alerts)
end
base.thread.switch("Notifications")
elseif (args[3] >= 2 and args[3] <= 18) and (args[4] == 13) then
if not base.thread.find("Change") then
base.thread.create("Change", program.account.change)
end
Internal.Swap.Change = "password"
base.thread.switch("Change")
elseif (args[3] >= 2 and args[3] <= 18) and (args[4] == 15) then
if not base.thread.find("Change") then
base.thread.create("Change", program.account.change)
end
Internal.Swap.Change = "email"
base.thread.switch("Change")
elseif (args[3] >= 2 and args[3] <= 18) and (args[4] == 17) then
if not base.thread.find("MyStats") then
base.thread.create("MyStats", program.account.stats)
end
base.thread.switch("MyStats")
end
end
end
end
\ No newline at end of file
function program.apps.comments(appid)
base.screen.colour("white")
base.draw.textc("Downloading comments...", 9, false, "grey", "white")
local scroll = 0
local ok, comments = Discover.Apps:Comment("list", appid)
if not ok then
Internal.Swap.Viewer[1] = appid
program.apps.view()
end
base.screen.colour("white")
program.draw.menubar("Comments: "..tostring(appid))
base.draw.box(1, 51, 19, 1, " ", "grey", "grey")
if Discover.User:LoggedIn() then
base.draw.textl(" Add", 19, false, "lightBlue", "grey")
end
base.draw.textr("Back ", 19, false, "orange", "grey")
local function run(scroll)
if #comments == 0 then
base.draw.textc("No comments to display", 9, false, "grey", "white")
end
for i=1, 14 do
if #comments >= i + scroll then
base.draw.box(1, 51, i+9, 1, " ", "white", "white")
base.draw.textl(comments[i+scroll].comment, i+3, false, "grey", "white")
base.draw.textr(comments[i+scroll].username, i+3, false, "cyan", "white")
end
end
end
run(scroll)
while true do
local args = { os.pullEvent() }
if args[1] == "timer" then
program.draw.menubar("Comments: "..tostring(appid))
elseif args[1] == "mouse_click" then
if args[4] >= 1 and args[4] <= 2 then
program.draw.menu.handler("Comments", args[3], args[4])
elseif (args[3] >= 2 and args[3] <= 4) and (args[4] == 19) then
if Discover.User:LoggedIn() then
local comment = base.gui.input("Comment Text:")
local status = Discover.Apps:Comment("add", appid, comment )
if status then
base.gui.alert("Added!")
sleep(0.5)
else
base.gui.alert("Failed")
sleep(1)
end
base.screen.colour("white")
base.draw.textc("Download comments...", 9, false, "grey", "white")
local scroll = 0
ok, comments = Discover.Apps:Comment("list", appid)
if not ok then
viewapps[1] = appid
store.apps.view()
end
base.screen.colour("white")
program.draw.menubar("Comments: "..tostring(appid))
base.draw.box(1, 51, 19, 1, " ", "grey", "grey")
if Discover.User:LoggedIn() then
base.draw.textl(" Add", 19, false, "lightBlue", "grey")
end
base.draw.textr("Back ", 19, false, "orange", "grey")
run(scroll)
end
elseif (args[3] >= 47 and args[3] <= 50) and (args[4] == 19) then
break
end
elseif args[1] == "mouse_scroll" then
if args[2] == -1 then
if scroll > 0 then
scroll = scroll - 1
run(scroll)
end
elseif args[2] == 1 then
if scroll + 14 <= #comments then
scroll = scroll + 1
run(scroll)
end
end
end
end
end
\ No newline at end of file
--[[
Name: apps.owned
Desc: All owned apps screen function
--]]
\ No newline at end of file
--]]
function program.apps.owned()
base.screen.colour("white")
base.draw.textc("Downloading your apps list...", 9, false, "grey", "white")
local ok, appslist = Discover.Apps:List("owned")
if not ok then
base.gui.alert("Could not obtain your Apps list...")
sleep(1.5)
if not base.thread.find("Apps") then
base.thread.create("Apps", program.apps.all)
end
base.thread.remove("Owned")
base.thread.switch("Apps")
end
base.draw.box(1, 51, 9, 1, " ", "white", "white")
program.draw.menubar("Apps: Owned")
base.draw.box(1, 51, 19, 1, " ", "grey", "grey")
base.draw.texta("Your Apps: "..tostring(#appslist), 2, 19, false, "orange", "grey")
local scroll = 0
local function fix(num)
if tostring(num):len() == 1 then
return " "..tostring(num)
else
return tostring(num)
end
end
local function run(scroll)
for i = 1, 14 do
if #appslist >= i + scroll then
base.draw.box(1, 51, i+3, 1, " ", "white", "white")
base.draw.texta(tostring(fix(i+scroll)..": "..appslist[i+scroll].name):sub(1, 40), 1, i+3, false, "grey", "white")
base.draw.texta("X", 50, i+3, false, "red", "white")
base.draw.texta("Edit", 44, i+3, false, "lightBlue", "white")
base.draw.texta("Upd", 40, i+3, false, "lightBlue", "white")
end
end
end
run(scroll)
while true do
local args = { os.pullEvent() }
if args[1] == "timer" then
program.draw.menubar("Apps: Owned")
elseif args[1] == "mouse_click" then
if args[4] >= 1 and args[4] <= 2 then
program.draw.menu.handler("Apps: Owned", args[3], args[4])
elseif (args[3] >= 40 and args[3] <= 42) and (args[4] >= 4 and args[4] <= 17) then
-- Do update
local appid = appslist[args[4] - 3 + scroll].id
Internal.Swap.Edit = appid
base.thread.create("Update", program.apps.update)
base.thread.switch("Update")
elseif (args[3] >= 44 and args[3] <= 47) and (args[4] >= 4 and args[4] <= 17) then
-- Do Edit
local appid = appslist[args[4] - 3 + scroll].id
Internal.Swap.Edit = appid
base.thread.create("Edit", program.apps.edit)
base.thread.switch("Edit")
elseif (args[3] == 50) and (args[4] >= 4 and args[4] <= 17) then
-- Do Delete
local appid = appslist[args[4] - 3 + scroll].id
local appname = appslist[args[4] - 3 + scroll].name
base.draw.box(8, 36, 8, 2, " ", "grey", "grey")
base.draw.box(8, 36, 10, 2, " ", "grey", "grey")
local text = "To delete the app: "..tostring(appname).." press \"enter\" otherwise please press any other button to exit."
for k,v in ipairs(base.data.wordwrap(text, 34)) do
base.draw.texta(v, 9, k+7, false, "white", "grey")
end
while true do
local ev, nk = os.pullEvent("key")
if ev == "key" then
if nk == 28 then
base.screen.colour("white")
store.draw.menu("Apps: Owned")
base.colour.set("cyan", "white")
term.setCursorPos(1, 4)
print("Deleting...")
local status = Discover.Apps:Delete( appid )
if status then
print("\nApp was deleted!!")
sleep(0.5)
print("Updating local cache...")
sleep(0.5)
program.apps.owned()
else
base.gui.alert(discover.data.errormsg)
sleep(1.5)
program.apps.owned()
end
else
break
end
else
break
end
end
end
elseif args[1] == "mouse_scroll" then
if args[2] == -1 then
if scroll > 0 then
scroll = scroll - 1
run(scroll)
end
elseif args[2] == 1 then
if scroll + 14 < #appslist then
scroll = scroll + 1
run(scroll)
end
end
end
end
end
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
......@@ -14,20 +14,29 @@ local paths = {
"core/core.icons.lua";
"core/core.dapi.lua";
"core/core.init.lua";
"core/core.commandline.lua";
"main/main.menu.lua";
"main/main.home.lua";
"main/main.alerts.lua";
"main/main.credits.lua";
"main/main.updates.lua";
"main/main.help.lua";
"apps/apps.all.lua";
"apps/apps.view.lua";
"apps/apps.download.lua";
"feed/feed.view.lua";
"account/account.login.lua";
"account/account.logout.lua";
"apps/apps.comments.lua";
"apps/apps.categories.lua";
"apps/apps.versions.lua";
"apps/apps.search.lua";
"apps/apps.downloads.lua";
"apps/apps.owned.lua";
"apps/apps.upload.lua";
"apps/apps.update.lua";
"apps/apps.edit.lua";
"feed/feed.view.lua";
"account/account.login.lua";
"account/account.logout.lua";
"account/account.manage.lua";
"apps/apps.packages.lua";
"snippets/snippets.all.lua";
"snippets/snippets.owned.lua";
......
......@@ -7,6 +7,7 @@ tArgs = { ... }
program = {}; program.core = {}; program.apps = {}; program.snippets = {}; program.cloud = {}; program.mail = {}; program.feed = {}; program.draw = {}; program.main = {}; program.draw.menu = {}; program.chat = {}; program.profiles = {}; program.account = {};
Plugin = {};
Internal = {
Data = {
Apps = {};
......@@ -15,6 +16,10 @@ Internal = {
Config = {
Path = ".DiscoverConfig";
};
Plugins = {
Enabled = true;
Path = "DA_Plugins";
};
Icons = {};
System = {
Platform = false;
......@@ -27,6 +32,8 @@ Internal = {
};
Swap = {
Viewer = {};
Edit = {};
Update = {};
};
}
......
......@@ -9,9 +9,11 @@ function program.core.init()
-- Run Loading Screen
local x, y = term.getSize();
base.screen.colour("white")
base.draw.textc("Discover App", 1, false, "grey", "white")
base.draw.textc("Developed By FluxDev", y, false, "red", "white")
local function drawLoad()
base.screen.colour("white")
base.draw.textc("Discover App", 1, false, "grey", "white")
base.draw.textc("Developed By FluxDev", y, false, "red", "white")
end
local function log(text)
local text = base.data.wordwrap(text, x-5)
for k,v in ipairs(text) do
......@@ -25,6 +27,52 @@ function program.core.init()
-- Expain Sequence
log("Running init sequence, please wait ...")
drawLoad();
-- Install Plugins
log("Checking for plugins, please wait ...")
if fs.exists(Internal.Plugins.Path) then
local list = fs.list(Internal.Plugins.Path)
local function install(filepath)
local ok, err = pcall(function()
if fs.exists(filepath) then
local basen, func = nil;
local f = fs.open(filepath, "r")
local count = 0;
for line in f.readLine do
count = count + 1
count = count + 1
if line:sub(1,8) == "-- @base" then
basen = tostring(line:sub(10))
elseif line:sub(1,8) == "-- @func" then
func = tostring(line:sub(10))
end
if basen and func then
program[basen] = {};
require(filepath);
Plugin[basen][func]();
break
end
if count > 25 then
break
end
end
f.close();
end
end)
if ok then
return "Success";
else
print(err)
sleep(1000)
return "Fail";
end
end
for k,v in ipairs(list) do
log("Installing plugins: " .. tostring(k) .. "/" .. tostring(#list) .. " :: " .. tostring(tostring(install(fs.combine(Internal.Plugins.Path, v)))))
drawLoad();
end
end
-- Check for app config
log("Searching for config ...")
......
This diff is collapsed.
This diff is collapsed.
function program.main.credits()
base.screen.colour("white")
program.draw.menubar("Credits")
local scroll = 0
base.draw.box(1, 51, 19, 1, " ", "grey", "grey")
base.draw.textr("Exit ", 19, false, "orange", "grey")
local credits = {
":";
"=";
"+ Credits";
"=";
"- Well as a note from myself (Danny), I just want to say thank you for using the App Store, and of course the Discover App. This app will encorporate mostly everything I make now, as it is easier to keep up one app, then multiple apps. I also plan to encorporate full embedding functions into this, as well as CLI version.";
"=";
"- If you ever want to help work on the app with me or other, please please please! Just ask, the help is appreciated and I have multiple things I need to add to this while it is in Beta, before it even gets branded as a release.";
"=";
":";
"=";
"+ Thanks to";
"=";
"- I wanted to say thank you to a few people including: Creator, as he was a good tester and was always giving feedback in the early days of the app, as well as Cranium for a few code snippets that have helped massively (probably doesn't even know it). I also want to thank ByteMe who helped me make the first step at designing the interface, (if you look back on the thread).";
"=";
":";
"=";
"+ Other Developers / Ideas";
"=";
"- Well if you didn't know me and WaitDev_ partnered up to help work on the Discover App, he helped a fair amount before leaving the development team due to not enough time, but he did help work on the image editor for apps, the icons on the home menu, and as well as working on a nice to look at menu system.";
"=";
"- Also Kouksi44 for the idea on having an in-built forums into the program and the use of his Classic API which adds a brilliant way of using OOP in Lua.";
"=";
":";
};
local function render(data, scroll)
-- render
for i=1, 14 do
if i+scroll <= #data then
base.draw.box(1, 51, i+3, 1, " ", "white", "white")
if data[i+scroll]:sub(1,3) == "[T]" then
base.draw.texta(data[i+scroll]:sub(5), 3, i+3, false, "grey", "white")
elseif data[i+scroll]:sub(1,3) == "[P]" then
base.draw.texta(data[i+scroll]:sub(5), 3, i+3, false, "cyan", "white")
elseif data[i+scroll]:sub(1,3) == "[L]" then
base.draw.textc(data[i+scroll]:sub(5), i+3, false, "lightGrey", "white")
elseif data[i+scroll]:sub(1,3) == "[S]" then
base.draw.texta(" ", 3, i+3, false, "cyan", "white")
end
end
end
end
local function parse(data)
-- parse
local new = {}
for k,v in ipairs(data) do
if v:sub(1,1) == "+" then
table.insert(new, "[T]:" .. tostring(v:sub(3)))
elseif v:sub(1,1) == "-" then
for a,b in ipairs(base.data.wordwrap(v:sub(3), 47)) do
table.insert(new, "[P]:" .. tostring(b))
end
elseif v:sub(1,1) == ":" then
table.insert(new, "[L]:" .. tostring(string.rep("-", 47)))
elseif v:sub(1,1) == "=" then
table.insert(new, "[S]")
end
end
return new;
end
local c = parse(credits);
render(c, scroll);
while true do
local args = { os.pullEvent() }
if args[1] == "timer" then
program.draw.menubar("Credits")
elseif args[1] == "mouse_click" then
if args[4] >= 1 and args[4] <= 2 then
program.draw.menu.handler("Credits", args[3], args[4])
elseif (args[3] >= 47 and args[3] <= 50) and (args[4] == 19) then
base.thread.remove("Credits")
if not base.thread.find("Home") then
base.thread.create("Home", program.main.home)
end
base.thread.switch("Home")
end
elseif args[1] == "mouse_scroll" then
if args[2] == -1 then
if scroll > 0 then
scroll = scroll - 1
render(c, scroll)
end
elseif args[2] == 1 then
if scroll+14 < #c then
scroll = scroll + 1
render(c, scroll)
end
end
end
end
end
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Brewing is how potions and splash potions are made in Minecraft.
Recipes: Despite the complicated web of potions that can be brewed from other potions, to brew a specific potion from the water bottle most efficiently the options are quite simple. The following table gives the most efficient way to brew each potion without wasting extra ingredients. Cases where the order of ingredients is irrelevant or two different ingredients are interchangeable are included. The potion of weakness, the only one which can be brewed without starting with a nether wart, can still be brewed from an awkward potion if the player wishes to convert all water bottles to awkward potions in preparation for brewing.
Weakness > fermented spider eye
Weakness E > fermented spider eye and redstone (if brewed from an awkward potion the fermented spider eye must be added first)
Strength > nether wart > blaze powder
Strength E > nether wart > blaze powder > redstone
Strength II > nether wart > blaze powder > glowstone
Regeneration > nether wart > ghast tear
Regeneration E > nether wart > ghast tear > redstone
Regeneration II > nether wart > ghast tear > glowstone
Swiftness > nether wart > sugar
Swiftness E > nether wart > sugar > redstone
Swiftness II > nether wart > sugar > glowstone
Slowness > nether wart > sugar or magma cream > fermented spider eye
Slowness E > nether wart > sugar or magma cream > fermented spider eye > redstone
Health > nether wart > glistering melon
Health II > nether wart > glistering melon > glowstone
Harming > nether wart > glistering melon or spider eye > fermented spider eye
Harming II > nether wart > glistering melon or spider eye > fermented spider eye and glowstone
Poison > nether wart > spider eye
Poison E > nether wart > spider eye > redstone
Poison II > nether wart > spider eye > glowstone
Fire Resistance > nether wart > magma cream
Fire Resistance E > nether wart > magma cream > redstone
History: Initially, the Cauldron was where potions were brewed. Code in Beta 1.9 pre2 revealed that Potions were brewed by adding water to the Cauldron followed by certain reagents. Correctly combined reagents would confer purely beneficial potion effects, and incorrect combinations added negative effects. The system was complicated, lacked a GUI, and formed many duplicate potions (i.e. two potions that were exactly the same could be made in several different ways), so Notch and Jeb came up with a new brewing method using a Brewing Stand.[1] The Cauldron's role in brewing was relegated to being a slightly more efficient storage vessel for water. Brewing was greatly streamlined and simplified when a brewing GUI was added and most duplicate potions were removed (the total possible potions went down from 150 combinations to only 25 different potions in 31 combinations). However, this new system made some potion effects available in earlier 1.9 pre-releases inaccessible (e.g. Nausea, Blindness and Invisibility).
Throwable Splash Potions were introduced in Beta 1.9 Pre4 and brewed by placing gunpowder and any potion together in a brewing stand. This pre-release also introduced Glistering Melon as an alchemical reagent to replace the instant health effect conferred by the Ghast Tear, which then added the effect of regeneration instead. This version also converted certain reagents into base-secondary reagents (the Spider Eye, Glistering Melon and Blaze Powder made Mundane Potion when brewed into a water bottle in addition to their previous functions), bringing the potion total to 28 different potions in 35 combinations.
Trivia:Only 1 ingredient is needed to brew into up to 3 potions. These three potions do not necessarily have to be the same.
Upgrading effect of potion that has no time parameter (i.e. Instant Health, Harming) with glowstone dust has no downsides.
Upgrading a Fire Resistance Potion with redstone dust has no downsides.
Although Jeb said that in the 1.9 pre-release 3 there were 161 possible different potion combinations with 2,653 in the future, in the actual third pre-release only 22 different potions could be made without the use of external programs. Of those, 19 potions had one of 8 different effects.
The Mundane Potion made from redstone has a different metadata (64) than the mundane potion made from any other ingredient (8192). Unlike Mundane 64, Mundane 8192 can be made into a Splash Mundane Potion by adding gunpowder that is, like its base potion, without any effect.
There are many Potions that were left behind from 1.9 pre-releases that fill up different metadatas that otherwise cannot be brewed or obtained without a SMP server command or inventory editor. These potions include but are not limited to: Bungling Potion, Buttering Potion, Debonair Potion, Refined Potion.
Splash potions can be fired by Dispensers.
Cauldrons can be entirely circumvented from the brewing process with no ill effects, as bottles can be filled by right-clicking on a water source block. This is an improvement from cauldrons, as one does not have to replenish the source block every three bottles, or indeed at all. This, however can not be done in the Nether, where cauldrons become essential.
Some splash potions have the opposite effect on undead mobs such as zombies and skeletons.
\ No newline at end of file
According to Wikipedia, biomes are climatically and geographically defined as similar climatic conditions on the Earth, such as communities of plants, animals, and soil organisms, and are often referred to as ecosystems.
In Minecraft, from the Halloween Update onwards, this means that different areas with varying heights, temperatures, humidity ratings and foliage colors are created.
Before the Halloween Update, when a map was generated it had either a Snowy or Grassy theme. But after the update, a single world includes all themes in a logical fashion determined from the biomes graph.
Biome Types Biome types may be easily distinguished by the differentiating grass and leaf colors in conjunction with the kind of blocks present, like cacti in deserts and pine trees in pine forests. They are randomly created during the generation of the world and are affected by the starting seed.
There are nine biomes in Minecraft 1.0.
Biome Description Features Image
Forest (Oak/Birch Forest) A biome with many trees and a fair amount of tall grass. Birch trees can be found in this biome. Oak and Birch Trees, Grass, Flowers, Tall Grass.
Taiga (Pine Forest) A biome with many pine/spruce trees and dull grey-blue grass. Wolves are also found on this biome more commonly than others. As of 1.8, it is most likely to spawn in one of these biomes. Snow and Ice occur in this biome after Minecraft 11w48a. Pine Trees, Grass, Flowers, Wolves, Tall Grass.
Swampland A flat biome with swamp-like trees with vines and shallow pools of clay, sand and dirt. The water, grass, leaves, vines and trees are much darker. The water can have floating lily pads. Mushrooms are also moderately common in swamps. There is a green-ish color in the water. Trees can sometimes spawn in the water in this biome. Oak Trees, Grass, Vines, Lily Pads, Clay, Mushrooms.
Extreme Hills (Mountains) A highly mountainous biome with dull grey-blue grass and few trees, added in the 1.8 Adventure Update. Prior to this update, mountains were found in all types of biomes, but now are very rare outside this type of land. More underground cave systems are present here than any other biome. Oak Trees, Grass.
Desert A very flat biome consisting mostly of sand, dead shrubs and cacti. No rain occurs in this biome. Sugar Cane can be found sometimes next to pools of water. NPC Villages spawn mostly in this biome. Sand, Cacti, Dead Bushes, Sandstone, Sugar Cane.
Plains A relatively flat biome with rolling hills and a large amount of tall grass (more than in any other type of land). The occasional tree does exist, although very rarely. Gulleys are also quite common in this biome. Tall Grass, Grass, Oak Trees.
Ocean A very big, flat open biome made entirely of water, with underwater reliefs such as small mountains and plains and usually includes sand and clay at its bottom. Ocean biomes can go down to 30 blocks deep and the occasional island may exist, as a small version of other biome types. Entrances to underground ravines can be also found at the bottom of the ocean, as well as Abandoned Mine Shafts (whose upper parts are mostly flooded due to the proximity of the ocean). Oceans can be larger than ten thousand blocks wide and long. Water, Sand, Clay.
Tundra A relatively flat biome covered in snow. Lakes and rivers are mostly frozen over and trees (only regular types are spawned) are scarce. Sugar canes do spawn in this biome, but are destroyed and dropped when the chunks load because of the ice that spreads over open water sources. Snow, Snowfall, Oak Trees, Ice, Sugar Cane.
Mushroom This biome consists of flat landscapes and high hills, has Mycelium instead of grass as its common surface block, and tends to appear as islands far from the spawn of a map and any significant landmass. It is the only biome where Huge Mushrooms can spawn and grow naturally, where mushrooms grow in full sunlight, and where Mooshrooms spawn.
It's actually composed of two different "biomes" - the shoreline, which is flat, and the mainland, which is more undulating (hilly). Contrary to popular belief, trees can be grown in this biome, but not next to Mycelium which will take over the dirt square from the sapling and un-plant the sapling. A player can create a Mycelium-free zone with cobblestone and grow a tree in the middle of it on freshly placed dirt. A player is also able to place saplings on mycelium and use bonemeal on the sapling to grow it. Otherwise, it is advised to collect wood (and saplings) before settling here.
No mobs other than Mooshrooms (including hostile mobs at night) spawn in this biome. This includes caves, abandoned mines, etc... below Mushroom Biomes, meaning exploring underground is relatively safe. Dungeons with spawners will still spawn mobs, however, and caution should still be taken when exploring (as sometimes "fingers" of other biomes project into mushroom biomes).
As of 1.0.0 player made structures in this biome are exempt from the "no mob spawn" rule: Only mushroom terrain originally created with the map seems to prevent mob spawning.
History: Biomes were added in Alpha 1.2.0, also known as the Halloween Update. In Beta 1.8, biomes got an overhaul, removing some biomes and others replaced with nine fractal-based biomes - some old, some new.
Difficulty: It can be difficult to play and gather sufficient resources if one starts in the middle of a biome with no trees, such as the desert, savanna, tundra, and especially the ocean.
There have been multiple reports of players spawning on tiny islands in the middle of a vast ocean with no trees for several Minecraft days in any direction. It appears that these desert islands generate in the Ocean biome, where animals cannot spawn (on the water); sometimes the island spawns with no trees so players have to delete the world and start again, swim great distances to a landmass, or search for nearby underwater openings into abandoned mineshafts to acquire wood. This is not quite as bad a problem if one starts the map in Creative Mode since the player is able to fly, make a boat, or plant trees. It is still undetermined whether this feature is a bug or not (Notch didn't say it was a bug, but the community seems to think it is).
\ No newline at end of file
According to Wikipedia, biomes are climatically and geographically defined as similar climatic conditions on the Earth, such as communities of plants, animals, and soil organisms, and are often referred to as ecosystems.
In Minecraft, from the Halloween Update onwards, this means that different areas with varying heights, temperatures, humidity ratings and foliage colors are created.
Before the Halloween Update, when a map was generated it had either a Snowy or Grassy theme. But after the update, a single world includes all themes in a logical fashion determined from the biomes graph.