Cleanup mobs API a bit and add more achievements

This commit is contained in:
KaadmY 2017-05-15 19:48:28 -07:00
parent b991f0e4a3
commit a66e8c7620
13 changed files with 1754 additions and 1603 deletions

View File

@ -12,21 +12,6 @@ achievements.registered_achievements_list = {}
local achievements_file = minetest.get_worldpath() .. "/achievements.dat"
local saving = false
function achievements.register_achievement(name, def)
local rd = {
title = def.title or name, -- good-looking name of the achievement
description = def.description or "The " .. name .. " achievement", -- description of what the achievement is, and how to get it
times = def.times or 1, -- how many times to trigger before getting the achievement
dignode = def.dignode or nil, -- digging this node also triggers the achievement
placenode = def.placenode or nil, -- placing this node also triggers the achievement
craftitem = def.craftitem or nil, -- crafting this item also triggers the achievement
}
achievements.registered_achievements[name] = def
table.insert(achievements.registered_achievements_list, name)
end
local function save_achievements()
local f = io.open(achievements_file, "w")
@ -57,9 +42,26 @@ local function load_achievements()
end
end
function achievements.register_achievement(name, def)
local rd = {
title = def.title or name, -- good-looking name of the achievement
description = def.description or "The " .. name .. " achievement", -- description of what the achievement is, and how to get it
times = def.times or 1, -- how many times to trigger before getting the achievement
dignode = def.dignode or nil, -- digging this node also triggers the achievement
placenode = def.placenode or nil, -- placing this node also triggers the achievement
craftitem = def.craftitem or nil, -- crafting this item also triggers the achievement
}
achievements.registered_achievements[name] = def
table.insert(achievements.registered_achievements_list, name)
end
function achievements.trigger_achievement(player, aname, times)
local name = player:get_player_name()
times = times or 1
if achievements.achievements[name] == nil then
achievements.achievements[name] = {}
end
@ -72,19 +74,25 @@ function achievements.trigger_achievement(player, aname, times)
return
end
achievements.achievements[name][aname] = achievements.achievements[name][aname] + (times or 1)
achievements.achievements[name][aname] = achievements.achievements[name][aname] + times
if not achievements.registered_achievements[aname] then
default.log("[mod:achievements] Cannot find registered achievement " .. aname, "error")
default.log("[mod:achievements] Cannot find registered achievement "
.. aname, "error")
return
end
if achievements.achievements[name][aname] >= achievements.registered_achievements[aname].times then
if achievements.achievements[name][aname]
>= achievements.registered_achievements[aname].times then
achievements.achievements[name][aname] = -1
minetest.after(2.0, function()
minetest.chat_send_all(
minetest.colorize("#0f0", "*** " .. name .." has earned the achievement [" ..
achievements.registered_achievements[aname].title .. "]"))
minetest.after(
2.0,
function()
minetest.chat_send_all(
minetest.colorize(
"#0f0",
"*** " .. name .." has earned the achievement [" ..
achievements.registered_achievements[aname].title .. "]"))
end)
end
@ -177,7 +185,8 @@ crafting.register_on_craft(on_craft)
local form = default.ui.get_page("default:default")
form = form .. "tableoptions[background=#DDDDDD30]"
form = form .. "tablecolumns[text,align=left,width=11;text,align=left,width=28;text,align=left,width=5]"
form = form .. "tablecolumns[text,align=left,width=11;text,align=left,width=28;"
.. "text,align=left,width=5]"
default.ui.register_page("achievements:achievements", form)
function achievements.get_formspec(name, row)
@ -209,13 +218,15 @@ function achievements.get_formspec(name, row)
end
achievement_list = achievement_list .. minetest.formspec_escape(def.title) .. ","
achievement_list = achievement_list .. minetest.formspec_escape(def.description) .. ","
achievement_list = achievement_list .. minetest.formspec_escape(def.description)
.. ","
achievement_list = achievement_list .. progress
end
local form = default.ui.get_page("achievements:achievements")
form = form .. "table[0.25,2.5;7.75,5.5;achievement_list;" .. achievement_list .. ";" .. row .. "]"
form = form .. "table[0.25,2.5;7.75,5.5;achievement_list;" .. achievement_list
.. ";" .. row .. "]"
local aname = achievements.registered_achievements_list[row]
local def = achievements.registered_achievements[aname]
@ -231,7 +242,11 @@ function achievements.get_formspec(name, row)
progress = "Missing"
end
form = form .. "label[0.25,8.15;" .. minetest.formspec_escape(amt_gotten .. " of " .. #achievements.registered_achievements_list .. " achievements gotten, " .. amt_progress .. " in progress") .. "]"
form = form .. "label[0.25,8.15;"
.. minetest.formspec_escape(amt_gotten.. " of "
.. #achievements.registered_achievements_list
.. " achievements gotten, " .. amt_progress
.. " in progress") .. "]"
form = form .. "label[0.25,0.25;" .. minetest.formspec_escape(def.title) .. "]"
form = form .. "label[7.25,0.25;" .. minetest.formspec_escape(progress) .. "]"
@ -258,7 +273,11 @@ local function receive_fields(player, form_name, fields)
end
end
minetest.show_formspec(name, "achievements:achievements", achievements.get_formspec(name, selected))
minetest.show_formspec(
name,
"achievements:achievements",
achievements.get_formspec(name, selected)
)
end
minetest.register_on_player_receive_fields(receive_fields)

View File

@ -0,0 +1,36 @@
--
-- Achievements
--
achievements.register_achievement(
"hunter",
{
title = "Hunter",
description = "Kill 5 animals for food",
times = 5,
})
achievements.register_achievement(
"bomb_has_been_defused",
{
title = "Bomb has Been Defused!",
description = "Kill a Mineturtle",
times = 1,
})
achievements.register_achievement(
"ranger",
{
title = "Ranger",
description = "Capture a tame animal",
times = 1,
})
achievements.register_achievement(
"best_friends_forever",
{
title = "Best Friends Forever",
description = "Tame an animal",
times = 1,
})

File diff suppressed because it is too large Load Diff

View File

@ -45,32 +45,54 @@ mobs:register_mob(
punch_start = 90,
punch_end = 101,
},
on_rightclick = function(self, clicker)
mobs:feed_tame(self, clicker, 8, true)
mobs:capture_mob(self, clicker, 0, 5, 40, false, nil)
end,
})
mobs:register_spawn("mobs:boar", {"default:dirt_with_grass"}, 20, 10, 15000, 1, 31000)
on_rightclick = function(self, clicker)
mobs:feed_tame(self, clicker, 8, true)
mobs:capture_mob(self, clicker, 0, 5, 40, false, nil)
end,
on_die = function(self, pos, hitter)
if hitter == nil or (hitter ~= nil and not hitter:is_player()) then
return
end
achievements.trigger_achievement(hitter, "hunter")
end,
})
mobs:register_spawn(
"mobs:boar",
{
"default:dirt_with_grass"
},
20,
10,
15000,
1,
31000
)
mobs:register_egg("mobs:boar", "Boar", "mobs_boar_inventory.png")
-- raw porkchop
-- Raw porkchop
minetest.register_craftitem(
"mobs:pork_raw",
{
description = "Raw Porkchop",
inventory_image = "mobs_pork_raw.png",
on_use = minetest.item_eat({hp = 4, sat = 30}),
})
})
-- Cooked porkchop
-- cooked porkchop
minetest.register_craftitem(
"mobs:pork",
{
description = "Cooked Porkchop",
inventory_image = "mobs_pork_cooked.png",
on_use = minetest.item_eat({hp = 8, sat = 50}),
})
})
minetest.register_craft(
{
@ -78,4 +100,4 @@ minetest.register_craft(
output = "mobs:pork",
recipe = "mobs:pork_raw",
cooktime = 5,
})
})

View File

@ -1,4 +1,10 @@
-- wool
--
-- Crafts and items
--
-- Wool
minetest.register_node(
"mobs:wool",
{
@ -7,25 +13,27 @@ minetest.register_node(
is_ground_content = false,
groups = {snappy = 2, oddly_breakable_by_hand = 3, fall_damage_add_percent = -25, fuzzy = 1},
sounds = default.node_sound_leaves_defaults(),
})
})
-- Raw meat
-- raw meat
minetest.register_craftitem(
"mobs:meat_raw",
{
description = "Raw Meat",
inventory_image = "mobs_meat_raw.png",
on_use = minetest.item_eat({hp = 3, sat = 30}),
})
})
-- Cooked meat
-- cooked meat
minetest.register_craftitem(
"mobs:meat",
"mobs:meat",
{
description = "Cooked Meat",
inventory_image = "mobs_meat_cooked.png",
on_use = minetest.item_eat({hp = 7, sat = 70}),
})
})
minetest.register_craft(
{
@ -33,40 +41,40 @@ minetest.register_craft(
output = "mobs:meat",
recipe = "mobs:meat_raw",
cooktime = 5,
})
})
-- Net
-- net (right click to capture animal)
minetest.register_tool(
"mobs:net",
{
description = "Net (Right-click to capture)",
inventory_image = "mobs_net.png",
})
})
minetest.register_craft(
crafting.register_craft(
{
output = "mobs:net",
recipe = {
{"", "", "default:fiber"},
{"", "default:fiber", "default:fiber"},
{"group:stick", "", ""},
items= {
"default:fiber 3",
"default:stick",
}
})
})
-- Lasso
-- lasso (right click to capture animal)
minetest.register_tool(
"mobs:lasso",
{
description = "Lasso (Right-click to capture)",
inventory_image = "mobs_lasso.png",
})
})
minetest.register_craft(
crafting.register_craft(
{
output = "mobs:lasso",
recipe = {
{"", "default:rope", ""},
{"default:rope", "", "default:rope"},
{"group:stick", "default:rope", ""},
items = {
"default:rope 4",
"default:stick",
}
})
})

View File

@ -1,2 +1,3 @@
default
util
achievements

View File

@ -1,3 +1,4 @@
--
-- Mobs mod
-- By PilzAdam, KrupnovPavel, Zeg9, TenPlus1
@ -6,10 +7,12 @@
local path = minetest.get_modpath("mobs")
-- Mob Api
-- Mob API
dofile(path.."/api.lua")
-- Animals
dofile(path.."/sheep.lua") -- PilzAdam
dofile(path.."/boar.lua") -- KrupnoPavel
dofile(path.."/skunk.lua") -- Kaadmy
@ -17,9 +20,15 @@ dofile(path.."/mineturtle.lua") -- Kaadmy
dofile(path.."/walker.lua") -- Kaadmy
-- NPC
dofile(path.."/npc.lua") -- TenPlus1
-- Mob Items
-- Mob items and crafts
dofile(path.."/crafts.lua")
-- Achievements
dofile(path.."/achievements.lua")
default.log("mod:mobs", "loaded")

View File

@ -1,3 +1,4 @@
-- Mineturtle by Kaadmy
mobs:register_mob(
@ -46,10 +47,28 @@ mobs:register_mob(
punch_end = 60,
},
on_rightclick = function(self, clicker)
mobs:feed_tame(self, clicker, 4, false)
mobs:capture_mob(self, clicker, 0, 20, 40, false, nil)
end,
})
mobs:feed_tame(self, clicker, 4, false)
mobs:capture_mob(self, clicker, 0, 20, 40, false, nil)
end,
on_die = function(self, pos, hitter)
if hitter == nil or (hitter ~= nil and not hitter:is_player()) then
return
end
mobs:register_spawn("mobs:mineturtle", {"default:dirt_with_grass"}, 20, 5, 200000, 1, 31000)
mobs:register_egg("mobs:mineturtle", "Mine Turtle", "mobs_mineturtle_inventory.png")
achievements.trigger_achievement(hitter, "bomb_has_been_defused")
end,
})
mobs:register_spawn(
"mobs:mineturtle",
{
"default:dirt_with_grass"
},
20,
5,
200000,
1,
31000
)
mobs:register_egg("mobs:mineturtle", "Mine Turtle", "mobs_mineturtle_inventory.png")

View File

@ -1,3 +1,4 @@
-- Npc by TenPlus1
-- Modded by Kaadmy
@ -63,56 +64,58 @@ for _, npc_type in pairs(npc_types) do
punch_end = 219,
},
on_spawn = function(self)
self.npc_type = npc_type
end,
self.npc_type = npc_type
end,
on_rightclick = function(self, clicker)
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- feed to heal npc
if item:get_name() == "mobs:meat" or item:get_name() == "mobs:pork" or item:get_name() == "farming:bread" then
local hp = self.object:get_hp()
-- return if full health
if hp >= self.hp_max then
minetest.chat_send_player(name, "Villager is no longer hungry.")
return
end
-- Feed to heal npc
hp = hp + 4
if hp > self.hp_max then hp = self.hp_max end
self.object:set_hp(hp)
if item:get_name() == "mobs:meat" or item:get_name() == "mobs:pork"
or item:get_name() == "farming:bread" then
-- take item
if not minetest.setting_getbool("creative_mode") then
item:take_item()
clicker:set_wielded_item(item)
end
-- right clicking with trading book trades, else changes order if tame
-- trading is done in the gold mod
else
-- if owner switch between follow and stand
if not self.npc_trade then
self.npc_trade = util.choice_element(gold.trades[self.npc_type], gold.pr)
end
local hp = self.object:get_hp()
-- return if full health
if hp >= self.hp_max then
minetest.chat_send_player(name, "Villager is no longer hungry.")
return
end
if not gold.trade(self.npc_trade, self.npc_type, clicker) then
if self.owner and self.owner == clicker:get_player_name() then
if self.order == "follow" then
self.order = "stand"
else
self.order = "follow"
end
end
end
end
hp = hp + 4
if hp > self.hp_max then hp = self.hp_max end
self.object:set_hp(hp)
mobs:feed_tame(self, clicker, 8, false)
-- mobs:capture_mob(self, clicker, 20, 5, 10, false, nil)
end,
})
-- take item
if not minetest.setting_getbool("creative_mode") then
item:take_item()
clicker:set_wielded_item(item)
end
-- Right clicking with trading book trades, else changes order if tame
-- Trading is done in the gold mod
else
-- If owner switch between follow and stand
if not self.npc_trade then
self.npc_trade = util.choice_element(
gold.trades[self.npc_type], gold.pr)
end
if not gold.trade(self.npc_trade, self.npc_type, clicker) then
if self.owner and self.owner == clicker:get_player_name() then
if self.order == "follow" then
self.order = "stand"
else
self.order = "follow"
end
end
end
end
mobs:feed_tame(self, clicker, 8, false)
end,
})
--mobs:register_spawn("mobs:npc", {"default:dirt_with_grass"}, 20, 0, 7000, 1, 31000)
mobs:register_egg("mobs:npc_" .. npc_type, "NPC", "default_brick.png^mobs_egg.png")
end
end

View File

@ -1,3 +1,4 @@
-- Sheep by PilzAdam; tweaked for Pixture by Kaadmy
mobs:register_mob(
@ -16,7 +17,7 @@ mobs:register_mob(
{"mobs_sheep.png"},
},
gotten_texture = {"mobs_sheep_shaved.png"},
-- gotten_mesh = "mobs_sheep.x",
-- gotten_mesh = "mobs_sheep.x",
makes_footstep_sound = true,
sounds = {
random = "mobs_sheep",
@ -46,68 +47,100 @@ mobs:register_mob(
follow = "farming:wheat",
view_range = 5,
replace_rate = 50,
replace_what = {"default:grass", "default:tall_grass", "farming:wheat_3", "farming:wheat_4"},
replace_what = {
"default:grass",
"default:tall_grass",
"farming:wheat_3",
"farming:wheat_4"
},
replace_with = "air",
replace_offset = -1,
on_replace = function(self, pos)
minetest.set_node(pos, {name = self.replace_with})
if mobs:feed_tame(self, self.follow, 8, true) then
if self.gotten == false then
self.object:set_properties(
{
textures = {"mobs_sheep.png"},
mesh = "mobs_sheep.x",
})
end
end
end,
minetest.set_node(pos, {name = self.replace_with})
if mobs:feed_tame(self, self.follow, 8, true) then
if self.gotten == false then
self.object:set_properties(
{
textures = {"mobs_sheep.png"},
mesh = "mobs_sheep.x",
})
end
end
end,
on_rightclick = function(self, clicker)
--are we feeding?
if mobs:feed_tame(self, clicker, 8, true) then
--if full grow fuzz
if self.gotten == false then
self.object:set_properties(
{
textures = {"mobs_sheep.png"},
mesh = "mobs_sheep.x",
})
end
return
end
-- Are we feeding?
local item = clicker:get_wielded_item()
local itemname = item:get_name()
if mobs:feed_tame(self, clicker, 8, true) then
-- If full grow, add fuzz
--are we giving a haircut>
if itemname == "default:shears" then
if self.gotten == false and self.child == false then
self.gotten = true -- shaved
local pos = self.object:getpos()
pos.y = pos.y + 0.5
local obj = minetest.add_item(pos, ItemStack("mobs:wool"))
if obj then
obj:setvelocity(
{
x = math.random(-1,1),
y = 5,
z = math.random(-1,1)
})
end
item:add_wear(650) -- 100 uses
clicker:set_wielded_item(item)
self.object:set_properties(
{
textures = {"mobs_sheep_shaved.png"},
mesh = "mobs_sheep.x",
})
end
return
end
if self.gotten == false then
self.object:set_properties(
{
textures = {"mobs_sheep.png"},
mesh = "mobs_sheep.x",
})
end
--are we capturing?
mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
end
})
return
end
local item = clicker:get_wielded_item()
local itemname = item:get_name()
-- Are we giving a haircut?
if itemname == "default:shears" then
if self.gotten == false and self.child == false then
self.gotten = true -- shaved
local pos = self.object:getpos()
pos.y = pos.y + 0.5
local obj = minetest.add_item(pos, ItemStack("mobs:wool"))
if obj then
obj:setvelocity(
{
x = math.random(-1,1),
y = 5,
z = math.random(-1,1)
})
end
item:add_wear(650) -- 100 uses
clicker:set_wielded_item(item)
self.object:set_properties(
{
textures = {"mobs_sheep_shaved.png"},
mesh = "mobs_sheep.x",
})
end
return
end
-- Are we capturing?
mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
end,
on_die = function(self, pos, hitter)
if hitter == nil or (hitter ~= nil and not hitter:is_player()) then
return
end
achievements.trigger_achievement(hitter, "hunter")
end,
})
mobs:register_spawn(
"mobs:sheep",
{
"default:dirt_with_grass"
},
20,
10,
15000,
1,
31000
)
mobs:register_egg("mobs:sheep", "Sheep", "mobs_sheep_inventory.png")
mobs:register_spawn("mobs:sheep", {"default:dirt_with_grass"}, 20, 10, 15000, 1, 31000)

View File

@ -44,10 +44,29 @@ mobs:register_mob(
punch_end = 101,
},
on_rightclick = function(self, clicker)
mobs:feed_tame(self, clicker, 6, true)
mobs:capture_mob(self, clicker, 10, 40, 20, false, nil)
end,
})
mobs:feed_tame(self, clicker, 6, true)
mobs:capture_mob(self, clicker, 10, 40, 20, false, nil)
end,
on_die = function(self, pos, hitter)
if hitter == nil or (hitter ~= nil and not hitter:is_player()) then
return
end
mobs:register_spawn("mobs:skunk", {"default:dirt_with_swamp_grass", "default:dirt_with_dry_grass"}, 20, 7, 12000, 2, 50)
mobs:register_egg("mobs:skunk", "Skunk", "mobs_skunk_inventory.png")
achievements.trigger_achievement(hitter, "hunter")
end,
})
mobs:register_spawn(
"mobs:skunk",
{
"default:dirt_with_swamp_grass",
"default:dirt_with_dry_grass"
},
20,
7,
12000,
2,
50
)
mobs:register_egg("mobs:skunk", "Skunk", "mobs_skunk_inventory.png")

View File

@ -55,6 +55,17 @@ mobs:register_mob(
punch_start = 25,
punch_end = 34,
},
})
})
mobs:register_spawn("mobs:walker", {"default:dry_dirt"}, 20, 14, 200000, 1, 31000)
mobs:register_spawn(
"mobs:walker",
{
"default:dry_dirt",
"default:dirt_with_dry_grass"
},
20,
14,
200000,
1,
31000
)

View File

@ -34,7 +34,7 @@ minetest.after(
on_blast = def.on_blast,
}
end
end)
end)
local function rand_pos(center, pos, radius)
pos.x = center.x + math.random(-radius, radius)
@ -90,7 +90,7 @@ local function destroy(drops, pos, cid)
def.on_blast(vector.new(pos), 1)
return
end
minetest.remove_node(pos)
if def then
local node_drops = minetest.get_node_drops(def.name, "")
@ -156,7 +156,7 @@ local function add_effects(pos, radius)
minsize = 16,
maxsize = 24,
texture = "tnt_smoke.png",
})
})
end
function tnt.burn(pos)
@ -168,7 +168,15 @@ function tnt.burn(pos)
end
end
local function explode(pos, radius)
function tnt.explode(pos, radius, sound)
minetest.sound_play(
sound,
{
pos = pos,
gain = 1.5,
max_hear_distance = 128
})
local pos = vector.round(pos)
local vm = VoxelManip()
local pr = PseudoRandom(os.time())
@ -204,12 +212,10 @@ local function explode(pos, radius)
return drops
end
function tnt.boom(pos)
minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 128})
minetest.remove_node(pos)
local drops = explode(pos, radius)
local drops = tnt.explode(pos, radius, "tnt_explode")
entity_physics(pos, radius)
eject_drops(drops, pos, radius)
add_effects(pos, radius)
@ -286,4 +292,4 @@ achievements.register_achievement(
craftitem = "tnt:tnt",
})
default.log("mod:tnt", "loaded")
default.log("mod:tnt", "loaded")