forked from VoxeLibre/VoxeLibre
Merge branch 'master' into kelp
This commit is contained in:
commit
52c788f197
|
@ -6,7 +6,7 @@ block has a hardness and the actual Minecraft digging time is determined by
|
|||
this:
|
||||
|
||||
1) The block's hardness
|
||||
2) The tool being used (the tool_multiplier and its efficiency level)
|
||||
2) The tool being used (the tool speed and its efficiency level)
|
||||
3) Whether the tool is considered as "eligible" for the block
|
||||
(e.g. only diamond pick eligible for obsidian)
|
||||
|
||||
|
@ -43,13 +43,13 @@ this field is a table which defines which groups the tool can dig and how
|
|||
efficiently.
|
||||
|
||||
_mcl_diggroups = {
|
||||
handy = { tool_multiplier = 1, level = 1, uses = 0 },
|
||||
pickaxey = { tool_multiplier = 1, level = 0, uses = 0 },
|
||||
handy = { speed = 1, level = 1, uses = 0 },
|
||||
pickaxey = { speed = 1, level = 0, uses = 0 },
|
||||
}
|
||||
|
||||
The "uses" field indicate how many uses (0 for infinite) a tool has when used on
|
||||
the specified digging group. The "tool_multiplier" field is a multiplier to the
|
||||
dig speed on that digging group.
|
||||
the specified digging group. The "speed" field is a multiplier to the dig speed
|
||||
on that digging group.
|
||||
|
||||
The "level" field indicates which levels of the group the tool can harvest. A
|
||||
level of 0 means that the tool cannot harvest blocks of that node. A level of 1
|
||||
|
@ -69,6 +69,8 @@ This also means that it is very important that no mod adds _mcl_autogroup as a
|
|||
dependency.
|
||||
--]]
|
||||
|
||||
assert(minetest.get_modpath("mcl_autogroup"), "This mod requires the mod mcl_autogroup to function")
|
||||
|
||||
-- Returns a table containing the unique "_mcl_hardness" for nodes belonging to
|
||||
-- each diggroup.
|
||||
local function get_hardness_values_for_groups()
|
||||
|
@ -135,19 +137,18 @@ end
|
|||
-- Parameters:
|
||||
-- group - the group which it is digging
|
||||
-- can_harvest - if the tool can harvest the block
|
||||
-- tool_multiplier - dig speed multiplier for tool (default 1)
|
||||
-- speed - dig speed multiplier for tool (default 1)
|
||||
-- efficiency - efficiency level for the tool if applicable
|
||||
local function get_digtimes(group, can_harvest, tool_multiplier, efficiency)
|
||||
tool_multiplier = tool_multiplier or 1
|
||||
local speed_multiplier = tool_multiplier
|
||||
local function get_digtimes(group, can_harvest, speed, efficiency)
|
||||
local speed = speed or 1
|
||||
if efficiency then
|
||||
speed_multiplier = speed_multiplier + efficiency * efficiency + 1
|
||||
speed = speed + efficiency * efficiency + 1
|
||||
end
|
||||
|
||||
local digtimes = {}
|
||||
|
||||
for index, hardness in pairs(hardness_values[group]) do
|
||||
local digtime = (hardness or 0) / speed_multiplier
|
||||
local digtime = (hardness or 0) / speed
|
||||
if can_harvest then
|
||||
digtime = digtime * 1.5
|
||||
else
|
||||
|
@ -177,8 +178,12 @@ end
|
|||
-- Add the groupcaps from a field in "_mcl_diggroups" to the groupcaps of a
|
||||
-- tool.
|
||||
local function add_groupcaps(toolname, groupcaps, groupcaps_def, efficiency)
|
||||
if not groupcaps_def then
|
||||
return
|
||||
end
|
||||
|
||||
for g, capsdef in pairs(groupcaps_def) do
|
||||
local mult = capsdef.tool_multiplier or 1
|
||||
local mult = capsdef.speed or 1
|
||||
local uses = capsdef.uses
|
||||
local def = mcl_autogroup.registered_diggroups[g]
|
||||
local max_level = def.levels and #def.levels or 1
|
||||
|
@ -195,7 +200,6 @@ local function add_groupcaps(toolname, groupcaps, groupcaps_def, efficiency)
|
|||
groupcaps[g .. "_dig"] = get_groupcap(g, level > 0, mult, efficiency, uses)
|
||||
end
|
||||
end
|
||||
return groupcaps
|
||||
end
|
||||
|
||||
-- Checks if the given node would drop its useful drop if dug by a given tool.
|
||||
|
@ -209,7 +213,7 @@ function mcl_autogroup.can_harvest(nodename, toolname)
|
|||
|
||||
-- Check if it can be dug by tool
|
||||
local tdef = minetest.registered_tools[toolname]
|
||||
if tdef then
|
||||
if tdef and tdef._mcl_diggroups then
|
||||
for g, gdef in pairs(tdef._mcl_diggroups) do
|
||||
if ndef.groups[g] then
|
||||
if ndef.groups[g] <= gdef.level then
|
||||
|
|
|
@ -12,6 +12,8 @@ as possible. Minetest loads mods in reverse alphabetical order.
|
|||
mcl_autogroup = {}
|
||||
mcl_autogroup.registered_diggroups = {}
|
||||
|
||||
assert(minetest.get_modpath("_mcl_autogroup"), "This mod requires the mod _mcl_autogroup to function")
|
||||
|
||||
-- Register a group as a digging group.
|
||||
--
|
||||
-- Parameters:
|
||||
|
|
|
@ -33,25 +33,26 @@ mcl_vars.MAP_BLOCKSIZE = math.max(1, core.MAP_BLOCKSIZE or 16)
|
|||
mcl_vars.mapgen_limit = math.max(1, tonumber(minetest.get_mapgen_setting("mapgen_limit")) or 31000)
|
||||
mcl_vars.MAX_MAP_GENERATION_LIMIT = math.max(1, core.MAX_MAP_GENERATION_LIMIT or 31000)
|
||||
local central_chunk_offset = -math.floor(mcl_vars.chunksize / 2)
|
||||
local chunk_size_in_nodes = mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE
|
||||
mcl_vars.central_chunk_offset_in_nodes = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE
|
||||
mcl_vars.chunk_size_in_nodes = mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE
|
||||
local central_chunk_min_pos = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE
|
||||
local central_chunk_max_pos = central_chunk_min_pos + chunk_size_in_nodes - 1
|
||||
local central_chunk_max_pos = central_chunk_min_pos + mcl_vars.chunk_size_in_nodes - 1
|
||||
local ccfmin = central_chunk_min_pos - mcl_vars.MAP_BLOCKSIZE -- Fullminp/fullmaxp of central chunk, in nodes
|
||||
local ccfmax = central_chunk_max_pos + mcl_vars.MAP_BLOCKSIZE
|
||||
local mapgen_limit_b = math.floor(math.min(mcl_vars.mapgen_limit, mcl_vars.MAX_MAP_GENERATION_LIMIT) / mcl_vars.MAP_BLOCKSIZE)
|
||||
local mapgen_limit_min = -mapgen_limit_b * mcl_vars.MAP_BLOCKSIZE
|
||||
local mapgen_limit_max = (mapgen_limit_b + 1) * mcl_vars.MAP_BLOCKSIZE - 1
|
||||
local numcmin = math.max(math.floor((ccfmin - mapgen_limit_min) / chunk_size_in_nodes), 0) -- Number of complete chunks from central chunk
|
||||
local numcmax = math.max(math.floor((mapgen_limit_max - ccfmax) / chunk_size_in_nodes), 0) -- fullminp/fullmaxp to effective mapgen limits.
|
||||
mcl_vars.mapgen_edge_min = central_chunk_min_pos - numcmin * chunk_size_in_nodes
|
||||
mcl_vars.mapgen_edge_max = central_chunk_max_pos + numcmax * chunk_size_in_nodes
|
||||
local numcmin = math.max(math.floor((ccfmin - mapgen_limit_min) / mcl_vars.chunk_size_in_nodes), 0) -- Number of complete chunks from central chunk
|
||||
local numcmax = math.max(math.floor((mapgen_limit_max - ccfmax) / mcl_vars.chunk_size_in_nodes), 0) -- fullminp/fullmaxp to effective mapgen limits.
|
||||
mcl_vars.mapgen_edge_min = central_chunk_min_pos - numcmin * mcl_vars.chunk_size_in_nodes
|
||||
mcl_vars.mapgen_edge_max = central_chunk_max_pos + numcmax * mcl_vars.chunk_size_in_nodes
|
||||
|
||||
local function coordinate_to_block(x)
|
||||
return math.floor(x / mcl_vars.MAP_BLOCKSIZE)
|
||||
end
|
||||
|
||||
local function coordinate_to_chunk(x)
|
||||
return math.floor((coordinate_to_block(x) + central_chunk_offset) / mcl_vars.chunksize)
|
||||
return math.floor((coordinate_to_block(x) - central_chunk_offset) / mcl_vars.chunksize)
|
||||
end
|
||||
|
||||
function mcl_vars.pos_to_block(pos)
|
||||
|
@ -70,7 +71,7 @@ function mcl_vars.pos_to_chunk(pos)
|
|||
}
|
||||
end
|
||||
|
||||
local k_positive = math.ceil(mcl_vars.MAX_MAP_GENERATION_LIMIT / chunk_size_in_nodes)
|
||||
local k_positive = math.ceil(mcl_vars.MAX_MAP_GENERATION_LIMIT / mcl_vars.chunk_size_in_nodes)
|
||||
local k_positive_z = k_positive * 2
|
||||
local k_positive_y = k_positive_z * k_positive_z
|
||||
|
||||
|
@ -174,3 +175,86 @@ minetest.craftitemdef_default.stack_max = 64
|
|||
-- Set random seed for all other mods (Remember to make sure no other mod calls this function)
|
||||
math.randomseed(os.time())
|
||||
|
||||
local chunks = {} -- intervals of chunks generated
|
||||
function mcl_vars.add_chunk(pos)
|
||||
local n = mcl_vars.get_chunk_number(pos) -- unsigned int
|
||||
local prev
|
||||
for i, d in pairs(chunks) do
|
||||
if n <= d[2] then -- we've found it
|
||||
if (n == d[2]) or (n >= d[1]) then return end -- already here
|
||||
if n == d[1]-1 then -- right before:
|
||||
if prev and (prev[2] == n-1) then
|
||||
prev[2] = d[2]
|
||||
table.remove(chunks, i)
|
||||
return
|
||||
end
|
||||
d[1] = n
|
||||
return
|
||||
end
|
||||
if prev and (prev[2] == n-1) then --join to previous
|
||||
prev[2] = n
|
||||
return
|
||||
end
|
||||
table.insert(chunks, i, {n, n}) -- insert new interval before i
|
||||
return
|
||||
end
|
||||
prev = d
|
||||
end
|
||||
chunks[#chunks+1] = {n, n}
|
||||
end
|
||||
function mcl_vars.is_generated(pos)
|
||||
local n = mcl_vars.get_chunk_number(pos) -- unsigned int
|
||||
for i, d in pairs(chunks) do
|
||||
if n <= d[2] then
|
||||
return (n >= d[1])
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- "Trivial" (actually NOT) function to just read the node and some stuff to not just return "ignore", like mt 5.4 does.
|
||||
-- p: Position, if it's wrong, {name="error"} node will return.
|
||||
-- force: optional (default: false) - Do the maximum to still read the node within us_timeout.
|
||||
-- us_timeout: optional (default: 244 = 0.000244 s = 1/80/80/80), set it at least to 3000000 to let mapgen to finish its job.
|
||||
--
|
||||
-- returns node definition, eg. {name="air"}. Unfortunately still can return {name="ignore"}.
|
||||
function mcl_vars.get_node(p, force, us_timeout)
|
||||
-- check initial circumstances
|
||||
if not p or not p.x or not p.y or not p.z then return {name="error"} end
|
||||
|
||||
-- try common way
|
||||
local node = minetest.get_node(p)
|
||||
if node.name ~= "ignore" then
|
||||
return node
|
||||
end
|
||||
|
||||
-- copy table to get sure it won't changed by other threads
|
||||
local pos = {x=p.x,y=p.y,z=p.z}
|
||||
|
||||
-- try LVM
|
||||
minetest.get_voxel_manip():read_from_map(pos, pos)
|
||||
node = minetest.get_node(pos)
|
||||
if node.name ~= "ignore" or not force then
|
||||
return node
|
||||
end
|
||||
|
||||
-- all ways failed - need to emerge (or forceload if generated)
|
||||
local us_timeout = us_timeout or 244
|
||||
if mcl_vars.is_generated(pos) then
|
||||
minetest.chat_send_all("IMPOSSIBLE! Please report this to MCL2 issue tracker!")
|
||||
minetest.forceload_block(pos)
|
||||
else
|
||||
minetest.emerge_area(pos, pos)
|
||||
end
|
||||
|
||||
local t = minetest.get_us_time()
|
||||
|
||||
node = minetest.get_node(pos)
|
||||
|
||||
while (not node or node.name == "ignore") and (minetest.get_us_time() - t < us_timeout) do
|
||||
node = minetest.get_node(pos)
|
||||
end
|
||||
|
||||
return node
|
||||
-- it still can return "ignore", LOL, even if force = true, but only after time out
|
||||
end
|
||||
|
|
|
@ -6,7 +6,7 @@ mcl_worlds = {}
|
|||
function mcl_worlds.is_in_void(pos)
|
||||
local void =
|
||||
not ((pos.y < mcl_vars.mg_overworld_max and pos.y > mcl_vars.mg_overworld_min) or
|
||||
(pos.y < mcl_vars.mg_nether_max and pos.y > mcl_vars.mg_nether_min) or
|
||||
(pos.y < mcl_vars.mg_nether_max+128 and pos.y > mcl_vars.mg_nether_min) or
|
||||
(pos.y < mcl_vars.mg_end_max and pos.y > mcl_vars.mg_end_min))
|
||||
|
||||
local void_deadly = false
|
||||
|
@ -15,11 +15,11 @@ function mcl_worlds.is_in_void(pos)
|
|||
-- Overworld → Void → End → Void → Nether → Void
|
||||
if pos.y < mcl_vars.mg_overworld_min and pos.y > mcl_vars.mg_end_max then
|
||||
void_deadly = pos.y < mcl_vars.mg_overworld_min - deadly_tolerance
|
||||
elseif pos.y < mcl_vars.mg_end_min and pos.y > mcl_vars.mg_nether_max then
|
||||
elseif pos.y < mcl_vars.mg_end_min and pos.y > mcl_vars.mg_nether_max+128 then
|
||||
-- The void between End and Nether. Like usual, but here, the void
|
||||
-- *above* the Nether also has a small tolerance area, so player
|
||||
-- can fly above the Nether without getting hurt instantly.
|
||||
void_deadly = (pos.y < mcl_vars.mg_end_min - deadly_tolerance) and (pos.y > mcl_vars.mg_nether_max + deadly_tolerance)
|
||||
void_deadly = (pos.y < mcl_vars.mg_end_min - deadly_tolerance) and (pos.y > mcl_vars.mg_nether_max+128 + deadly_tolerance)
|
||||
elseif pos.y < mcl_vars.mg_nether_min then
|
||||
void_deadly = pos.y < mcl_vars.mg_nether_min - deadly_tolerance
|
||||
end
|
||||
|
@ -35,7 +35,7 @@ end
|
|||
function mcl_worlds.y_to_layer(y)
|
||||
if y >= mcl_vars.mg_overworld_min then
|
||||
return y - mcl_vars.mg_overworld_min, "overworld"
|
||||
elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max then
|
||||
elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max+128 then
|
||||
return y - mcl_vars.mg_nether_min, "nether"
|
||||
elseif y >= mcl_vars.mg_end_min and y <= mcl_vars.mg_end_max then
|
||||
return y - mcl_vars.mg_end_min, "end"
|
||||
|
@ -73,7 +73,7 @@ end
|
|||
-- Takes a position and returns true if this position can have Nether dust
|
||||
function mcl_worlds.has_dust(pos)
|
||||
-- Weather in the Overworld and the high part of the void below
|
||||
return pos.y <= mcl_vars.mg_nether_max + 64 and pos.y >= mcl_vars.mg_nether_min - 64
|
||||
return pos.y <= mcl_vars.mg_nether_max + 138 and pos.y >= mcl_vars.mg_nether_min - 10
|
||||
end
|
||||
|
||||
-- Takes a position (pos) and returns true if compasses are working here
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
local S = minetest.get_translator("mcl_boats")
|
||||
|
||||
local boat_visual_size = {x = 3, y = 3, z = 3}
|
||||
local boat_visual_size = {x = 1, y = 1, z = 1}
|
||||
local paddling_speed = 22
|
||||
local boat_y_offset = 0.35
|
||||
local boat_y_offset_ground = boat_y_offset + 0.6
|
||||
|
@ -12,9 +12,7 @@ local function is_group(pos, group)
|
|||
return minetest.get_item_group(nn, group) ~= 0
|
||||
end
|
||||
|
||||
local function is_water(pos)
|
||||
return is_group(pos, "water")
|
||||
end
|
||||
local is_water = flowlib.is_water
|
||||
|
||||
local function is_ice(pos)
|
||||
return is_group(pos, "ice")
|
||||
|
@ -247,7 +245,7 @@ function boat.on_step(self, dtime, moveresult)
|
|||
else
|
||||
local ctrl = self._passenger:get_player_control()
|
||||
if ctrl and ctrl.sneak then
|
||||
detach_player(self._passenger, true)
|
||||
detach_object(self._passenger, true)
|
||||
self._passenger = nil
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
name = mcl_boats
|
||||
author = PilzAdam
|
||||
description = Adds drivable boats.
|
||||
depends = mcl_player
|
||||
depends = mcl_player, flowlib
|
||||
optional_depends = mcl_core, doc_identifier
|
||||
|
||||
|
||||
|
|
Binary file not shown.
|
@ -167,7 +167,7 @@ function mcl_burning.set_on_fire(obj, burn_time, reason)
|
|||
hud_elem_type = "image",
|
||||
position = {x = 0.5, y = 0.5},
|
||||
scale = {x = -100, y = -100},
|
||||
text = "mcl_burning_hud_flame_animated.png",
|
||||
text = "mcl_burning_entity_flame_animated.png^[opacity:180^[verticalframe:" .. mcl_burning.animation_frames .. ":" .. 1,
|
||||
z_index = 1000,
|
||||
}) + 1
|
||||
end
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
local S = minetest.get_translator("mcl_falling_nodes")
|
||||
local dmes = minetest.get_modpath("mcl_death_messages") ~= nil
|
||||
local has_mcl_armor = minetest.get_modpath("mcl_armor")
|
||||
|
||||
local is_creative_enabled = minetest.is_creative_enabled
|
||||
|
||||
local get_falling_depth = function(self)
|
||||
if not self._startpos then
|
||||
|
@ -13,9 +16,8 @@ local deal_falling_damage = function(self, dtime)
|
|||
if minetest.get_item_group(self.node.name, "falling_node_damage") == 0 then
|
||||
return
|
||||
end
|
||||
-- Cause damage to any player it hits.
|
||||
-- Cause damage to any entity it hits.
|
||||
-- Algorithm based on MC anvils.
|
||||
-- TODO: Support smashing other objects, too.
|
||||
local pos = self.object:get_pos()
|
||||
if not self._startpos then
|
||||
-- Fallback
|
||||
|
@ -23,30 +25,39 @@ local deal_falling_damage = function(self, dtime)
|
|||
end
|
||||
local objs = minetest.get_objects_inside_radius(pos, 1)
|
||||
for _,v in ipairs(objs) do
|
||||
local hp = v:get_hp()
|
||||
if v:is_player() and hp ~= 0 then
|
||||
if not self._hit_players then
|
||||
self._hit_players = {}
|
||||
end
|
||||
if v:is_player() then
|
||||
local hp = v:get_hp()
|
||||
local name = v:get_player_name()
|
||||
local hit = false
|
||||
for _,v in ipairs(self._hit_players) do
|
||||
if name == v then
|
||||
hit = true
|
||||
if hp ~= 0 then
|
||||
if not self._hit_players then
|
||||
self._hit_players = {}
|
||||
end
|
||||
end
|
||||
if not hit then
|
||||
table.insert(self._hit_players, name)
|
||||
local way = self._startpos.y - pos.y
|
||||
local damage = (way - 1) * 2
|
||||
damage = math.min(40, math.max(0, damage))
|
||||
if damage >= 1 then
|
||||
hp = hp - damage
|
||||
if hp < 0 then
|
||||
hp = 0
|
||||
local hit = false
|
||||
for _,v in ipairs(self._hit_players) do
|
||||
if name == v then
|
||||
hit = true
|
||||
end
|
||||
if v:is_player() then
|
||||
-- TODO: Reduce damage if wearing a helmet
|
||||
end
|
||||
if not hit then
|
||||
table.insert(self._hit_players, name)
|
||||
local way = self._startpos.y - pos.y
|
||||
local damage = (way - 1) * 2
|
||||
damage = math.min(40, math.max(0, damage))
|
||||
if damage >= 1 then
|
||||
hp = hp - damage
|
||||
if hp < 0 then
|
||||
hp = 0
|
||||
end
|
||||
-- Reduce damage if wearing a helmet
|
||||
local inv = v:get_inventory()
|
||||
local helmet = inv:get_stack("armor", 2)
|
||||
if has_mcl_armor and not helmet:is_empty() then
|
||||
hp = hp/4*3
|
||||
if not is_creative_enabled(name) then
|
||||
helmet:add_wear(65535/helmet:get_definition().groups.mcl_armor_uses) --TODO: be sure damage is exactly like mc (informations are missing in the mc wiki)
|
||||
inv:set_stack("armor", 2, helmet)
|
||||
end
|
||||
end
|
||||
local msg
|
||||
if minetest.get_item_group(self.node.name, "anvil") ~= 0 then
|
||||
msg = S("@1 was smashed by a falling anvil.", v:get_player_name())
|
||||
|
@ -56,8 +67,35 @@ local deal_falling_damage = function(self, dtime)
|
|||
if dmes then
|
||||
mcl_death_messages.player_damage(v, msg)
|
||||
end
|
||||
v:set_hp(hp, { type = "punch", from = "mod" })
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
local hp = v:get_luaentity().health
|
||||
if hp and hp ~= 0 then
|
||||
if not self._hit_mobs then
|
||||
self._hit_mobs = {}
|
||||
end
|
||||
local hit = false
|
||||
for _,mob in ipairs(self._hit_mobs) do
|
||||
if v == mob then
|
||||
hit = true
|
||||
end
|
||||
end
|
||||
--TODO: reduce damage for mobs then they will be able to wear armor
|
||||
if not hit then
|
||||
table.insert(self._hit_mobs, v)
|
||||
local way = self._startpos.y - pos.y
|
||||
local damage = (way - 1) * 2
|
||||
damage = math.min(40, math.max(0, damage))
|
||||
if damage >= 1 then
|
||||
hp = hp - damage
|
||||
if hp < 0 then
|
||||
hp = 0
|
||||
end
|
||||
v:get_luaentity().health = hp
|
||||
end
|
||||
v:set_hp(hp, { type = "punch", from = "mod" })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
local has_awards = minetest.get_modpath("awards")
|
||||
|
||||
mcl_item_entity = {}
|
||||
|
||||
--basic settings
|
||||
local item_drop_settings = {} --settings table
|
||||
item_drop_settings.age = 1.0 --how old a dropped item (_insta_collect==false) has to be before collecting
|
||||
|
@ -16,16 +20,33 @@ local get_gravity = function()
|
|||
return tonumber(minetest.settings:get("movement_gravity")) or 9.81
|
||||
end
|
||||
|
||||
local registered_pickup_achievement = {}
|
||||
|
||||
--TODO: remove limitation of 1 award per itemname
|
||||
function mcl_item_entity.register_pickup_achievement(itemname, award)
|
||||
if not has_awards then
|
||||
minetest.log("warning", "[mcl_item_entity] Trying to register pickup achievement ["..award.."] for ["..itemname.."] while awards missing")
|
||||
elseif registered_pickup_achievement[itemname] then
|
||||
minetest.log("error", "[mcl_item_entity] Trying to register already existing pickup achievement ["..award.."] for ["..itemname.."]")
|
||||
else
|
||||
registered_pickup_achievement[itemname] = award
|
||||
end
|
||||
end
|
||||
|
||||
mcl_item_entity.register_pickup_achievement("tree", "mcl:mineWood")
|
||||
mcl_item_entity.register_pickup_achievement("mcl_mobitems:blaze_rod", "mcl:blazeRod")
|
||||
mcl_item_entity.register_pickup_achievement("mcl_mobitems:leather", "mcl:killCow")
|
||||
mcl_item_entity.register_pickup_achievement("mcl_core:diamond", "mcl:diamonds")
|
||||
|
||||
local check_pickup_achievements = function(object, player)
|
||||
local itemname = ItemStack(object:get_luaentity().itemstring):get_name()
|
||||
if minetest.get_item_group(itemname, "tree") ~= 0 then
|
||||
awards.unlock(player:get_player_name(), "mcl:mineWood")
|
||||
elseif itemname == "mcl_mobitems:blaze_rod" then
|
||||
awards.unlock(player:get_player_name(), "mcl:blazeRod")
|
||||
elseif itemname == "mcl_mobitems:leather" then
|
||||
awards.unlock(player:get_player_name(), "mcl:killCow")
|
||||
elseif itemname == "mcl_core:diamond" then
|
||||
awards.unlock(player:get_player_name(), "mcl:diamonds")
|
||||
if has_awards then
|
||||
local itemname = ItemStack(object:get_luaentity().itemstring):get_name()
|
||||
local playername = player:get_player_name()
|
||||
for name,award in pairs(registered_pickup_achievement) do
|
||||
if itemname == name or minetest.get_item_group(itemname, name) ~= 0 then
|
||||
awards.unlock(playername, award)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -165,10 +186,6 @@ minetest.register_globalstep(function(dtime)
|
|||
end
|
||||
end)
|
||||
|
||||
local minigroups = { "shearsy", "swordy", "shearsy_wool", "swordy_cobweb" }
|
||||
local basegroups = { "pickaxey", "axey", "shovely" }
|
||||
local materials = { "wood", "gold", "stone", "iron", "diamond" }
|
||||
|
||||
-- Stupid workaround to get drops from a drop table:
|
||||
-- Create a temporary table in minetest.registered_nodes that contains the proper drops,
|
||||
-- because unfortunately minetest.get_node_drops needs the drop table to be inside a registered node definition
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
local S = minetest.get_translator("mcl_minecarts")
|
||||
|
||||
local has_mcl_wip = minetest.get_modpath("mcl_wip")
|
||||
|
||||
mcl_minecarts = {}
|
||||
mcl_minecarts.modpath = minetest.get_modpath("mcl_minecarts")
|
||||
mcl_minecarts.speed_max = 10
|
||||
|
@ -662,8 +664,6 @@ register_minecart(
|
|||
"mcl_minecarts_minecart_chest.png",
|
||||
{"mcl_minecarts:minecart", "mcl_chests:chest"},
|
||||
nil, nil, false)
|
||||
|
||||
mcl_wip.register_wip_item("mcl_minecarts:chest_minecart")
|
||||
|
||||
-- Minecart with Furnace
|
||||
register_minecart(
|
||||
|
@ -719,8 +719,6 @@ register_minecart(
|
|||
end, nil, false
|
||||
)
|
||||
|
||||
mcl_wip.register_wip_item("mcl_minecarts:furnace_minecart")
|
||||
|
||||
-- Minecart with Command Block
|
||||
register_minecart(
|
||||
"mcl_minecarts:command_block_minecart",
|
||||
|
@ -742,8 +740,6 @@ register_minecart(
|
|||
nil, nil, false
|
||||
)
|
||||
|
||||
mcl_wip.register_wip_item("mcl_minecarts:command_block_minecart")
|
||||
|
||||
-- Minecart with Hopper
|
||||
register_minecart(
|
||||
"mcl_minecarts:hopper_minecart",
|
||||
|
@ -762,8 +758,6 @@ register_minecart(
|
|||
nil, nil, false
|
||||
)
|
||||
|
||||
mcl_wip.register_wip_item("mcl_minecarts:hopper_minecart")
|
||||
|
||||
-- Minecart with TNT
|
||||
register_minecart(
|
||||
"mcl_minecarts:tnt_minecart",
|
||||
|
@ -824,29 +818,34 @@ minetest.register_craft({
|
|||
|
||||
-- TODO: Re-enable crafting of special minecarts when they have been implemented
|
||||
if false then
|
||||
minetest.register_craft({
|
||||
output = "mcl_minecarts:furnace_minecart",
|
||||
recipe = {
|
||||
{"mcl_furnaces:furnace"},
|
||||
{"mcl_minecarts:minecart"},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_minecarts:furnace_minecart",
|
||||
recipe = {
|
||||
{"mcl_furnaces:furnace"},
|
||||
{"mcl_minecarts:minecart"},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_minecarts:hopper_minecart",
|
||||
recipe = {
|
||||
{"mcl_hoppers:hopper"},
|
||||
{"mcl_minecarts:minecart"},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_minecarts:chest_minecart",
|
||||
recipe = {
|
||||
{"mcl_chests:chest"},
|
||||
{"mcl_minecarts:minecart"},
|
||||
},
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "mcl_minecarts:hopper_minecart",
|
||||
recipe = {
|
||||
{"mcl_hoppers:hopper"},
|
||||
{"mcl_minecarts:minecart"},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_minecarts:chest_minecart",
|
||||
recipe = {
|
||||
{"mcl_chests:chest"},
|
||||
{"mcl_minecarts:minecart"},
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if has_mcl_wip then
|
||||
mcl_wip.register_wip_item("mcl_minecarts:chest_minecart")
|
||||
mcl_wip.register_wip_item("mcl_minecarts:furnace_minecart")
|
||||
mcl_wip.register_wip_item("mcl_minecarts:command_block_minecart")
|
||||
mcl_wip.register_wip_item("mcl_minecarts:hopper_minecart")
|
||||
end
|
|
@ -1,6 +1,6 @@
|
|||
name = mcl_minecarts
|
||||
author = Krock
|
||||
description = Minecarts are vehicles to move players quickly on rails.
|
||||
depends = mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons, mcl_wip
|
||||
optional_depends = doc_identifier
|
||||
depends = mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons
|
||||
optional_depends = doc_identifier, mcl_wip
|
||||
|
||||
|
|
|
@ -283,6 +283,33 @@ local get_velocity = function(self)
|
|||
return 0
|
||||
end
|
||||
|
||||
local function update_roll(self)
|
||||
local is_Fleckenstein = self.nametag == "Fleckenstein"
|
||||
local was_Fleckenstein = false
|
||||
|
||||
local rot = self.object:get_rotation()
|
||||
rot.z = is_Fleckenstein and pi or 0
|
||||
self.object:set_rotation(rot)
|
||||
|
||||
local cbox = table.copy(self.collisionbox)
|
||||
local acbox = self.object:get_properties().collisionbox
|
||||
|
||||
if math.abs(cbox[2] - acbox[2]) > 0.1 then
|
||||
was_Fleckenstein = true
|
||||
end
|
||||
|
||||
if is_Fleckenstein ~= was_Fleckenstein then
|
||||
local pos = self.object:get_pos()
|
||||
pos.y = pos.y + (acbox[2] + acbox[5])
|
||||
self.object:set_pos(pos)
|
||||
end
|
||||
|
||||
if is_Fleckenstein then
|
||||
cbox[2], cbox[5] = -cbox[5], -cbox[2]
|
||||
end
|
||||
|
||||
self.object:set_properties({collisionbox = cbox})
|
||||
end
|
||||
|
||||
-- set and return valid yaw
|
||||
local set_yaw = function(self, yaw, delay, dtime)
|
||||
|
@ -298,6 +325,7 @@ local set_yaw = function(self, yaw, delay, dtime)
|
|||
yaw = yaw + (math.random() * 2 - 1) * 5 * dtime
|
||||
end
|
||||
self.object:set_yaw(yaw)
|
||||
update_roll(self)
|
||||
return yaw
|
||||
end
|
||||
|
||||
|
@ -645,9 +673,9 @@ local update_tag = function(self)
|
|||
nametag = tag,
|
||||
})
|
||||
|
||||
update_roll(self)
|
||||
end
|
||||
|
||||
|
||||
-- drop items
|
||||
local item_drop = function(self, cooked, looting_level)
|
||||
|
||||
|
@ -2826,7 +2854,7 @@ local falling = function(self, pos)
|
|||
end
|
||||
|
||||
if mcl_portals ~= nil then
|
||||
if mcl_portals.nether_portal_cooloff[self.object] then
|
||||
if mcl_portals.nether_portal_cooloff(self.object) then
|
||||
return false -- mob has teleported through Nether portal - it's 99% not falling
|
||||
end
|
||||
end
|
||||
|
@ -2856,6 +2884,18 @@ local falling = function(self, pos)
|
|||
self.object:set_acceleration({x = 0, y = 0, z = 0})
|
||||
end
|
||||
|
||||
if minetest.registered_nodes[node_ok(pos).name].groups.lava then
|
||||
|
||||
if self.floats_on_lava == 1 then
|
||||
|
||||
self.object:set_acceleration({
|
||||
x = 0,
|
||||
y = -self.fall_speed / (max(1, v.y) ^ 2),
|
||||
z = 0
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
-- in water then float up
|
||||
if minetest.registered_nodes[node_ok(pos).name].groups.water then
|
||||
|
||||
|
@ -3475,6 +3515,7 @@ local mob_step = function(self, dtime)
|
|||
yaw = yaw + (math.random() * 2 - 1) * 5 * dtime
|
||||
end
|
||||
self.object:set_yaw(yaw)
|
||||
update_roll(self)
|
||||
end
|
||||
|
||||
-- end rotation
|
||||
|
@ -3773,6 +3814,7 @@ minetest.register_entity(name, {
|
|||
knock_back = def.knock_back ~= false,
|
||||
shoot_offset = def.shoot_offset or 0,
|
||||
floats = def.floats or 1, -- floats in water by default
|
||||
floats_on_lava = def.floats_on_lava or 0,
|
||||
replace_rate = def.replace_rate,
|
||||
replace_what = def.replace_what,
|
||||
replace_with = def.replace_with,
|
||||
|
|
|
@ -521,7 +521,7 @@ if c("totem") then
|
|||
-- Totem of Undying
|
||||
minetest.register_craftitem("mobs_mc:totem", {
|
||||
description = S("Totem of Undying"),
|
||||
_tt_help = minetest.colorize("#00FF00", S("Protects you from death while wielding it")),
|
||||
_tt_help = minetest.colorize(mcl_colors.GREEN, S("Protects you from death while wielding it")),
|
||||
_doc_items_longdesc = S("A totem of undying is a rare artifact which may safe you from certain death."),
|
||||
_doc_items_usagehelp = S("The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however."),
|
||||
inventory_image = "mcl_totems_totem.png",
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
name = mobs_mc
|
||||
author = maikerumine
|
||||
description = Adds Minecraft-like monsters and animals.
|
||||
depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip
|
||||
depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip, mcl_colors
|
||||
optional_depends = default, mcl_tnt, mcl_bows, mcl_throwing, mcl_fishing, bones, mesecons_materials, mobs_mc_gameconfig, doc_items
|
||||
|
||||
|
|
|
@ -25,6 +25,19 @@ local colors = {
|
|||
unicolor_black = { mobs_mc.items.wool_black, "#000000D0" },
|
||||
}
|
||||
|
||||
local rainbow_colors = {
|
||||
"unicolor_light_red",
|
||||
"unicolor_red",
|
||||
"unicolor_orange",
|
||||
"unicolor_yellow",
|
||||
"unicolor_green",
|
||||
"unicolor_dark_green",
|
||||
"unicolor_light_blue",
|
||||
"unicolor_blue",
|
||||
"unicolor_violet",
|
||||
"unicolor_red_violet"
|
||||
}
|
||||
|
||||
if minetest.get_modpath("mcl_wool") ~= nil then
|
||||
colors["unicolor_light_blue"] = { mobs_mc.items.wool_light_blue, "#5050FFD0" }
|
||||
end
|
||||
|
@ -112,7 +125,7 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
end,
|
||||
|
||||
-- Set random color on spawn
|
||||
do_custom = function(self)
|
||||
do_custom = function(self, dtime)
|
||||
if not self.initial_color_set then
|
||||
local r = math.random(0,100000)
|
||||
local textures
|
||||
|
@ -149,8 +162,35 @@ mobs:register_mob("mobs_mc:sheep", {
|
|||
}
|
||||
self.initial_color_set = true
|
||||
end
|
||||
|
||||
local is_kay27 = self.nametag == "kay27"
|
||||
|
||||
if self.color_change_timer then
|
||||
local old_color = self.color
|
||||
if is_kay27 then
|
||||
self.color_change_timer = self.color_change_timer - dtime
|
||||
if self.color_change_timer < 0 then
|
||||
self.color_change_timer = 0.5
|
||||
self.color_index = (self.color_index + 1) % #rainbow_colors
|
||||
self.color = rainbow_colors[self.color_index + 1]
|
||||
end
|
||||
else
|
||||
self.color_change_timer = nil
|
||||
self.color_index = nil
|
||||
self.color = self.initial_color
|
||||
end
|
||||
|
||||
if old_color ~= self.color then
|
||||
self.base_texture = sheep_texture(self.color)
|
||||
self.object:set_properties({textures = self.base_texture})
|
||||
end
|
||||
elseif is_kay27 then
|
||||
self.initial_color = self.color
|
||||
self.color_change_timer = 0
|
||||
self.color_index = -1
|
||||
end
|
||||
end,
|
||||
|
||||
|
||||
on_rightclick = function(self, clicker)
|
||||
local item = clicker:get_wielded_item()
|
||||
|
||||
|
|
|
@ -109,7 +109,6 @@ local slime_big = {
|
|||
fear_height = 0,
|
||||
spawn_small_alternative = "mobs_mc:slime_small",
|
||||
on_die = spawn_children_on_die("mobs_mc:slime_small", 4, 1.0, 1.5),
|
||||
fire_resistant = true,
|
||||
use_texture_alpha = true,
|
||||
}
|
||||
mobs:register_mob("mobs_mc:slime_big", slime_big)
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
|
@ -516,7 +516,7 @@ local function show_trade_formspec(playername, trader, tradenum)
|
|||
"size[9,8.75]"
|
||||
.."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]"
|
||||
..disabled_img
|
||||
.."label[4,0;"..F(minetest.colorize("#313131", S(profession))).."]"
|
||||
.."label[4,0;"..F(minetest.colorize(mcl_colors.DARK_GRAY, S(profession))).."]"
|
||||
.."list[current_player;main;0,4.5;9,3;9]"
|
||||
.."list[current_player;main;0,7.74;9,1;]"
|
||||
..b_prev..b_next
|
||||
|
@ -967,6 +967,10 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
drops = {},
|
||||
can_despawn = false,
|
||||
-- TODO: sounds
|
||||
sounds = {
|
||||
random = "mobs_mc_villager",
|
||||
distance = 10,
|
||||
},
|
||||
animation = {
|
||||
stand_speed = 25,
|
||||
stand_start = 40,
|
||||
|
|
|
@ -16,7 +16,7 @@ mobs:register_mob("mobs_mc:wither", {
|
|||
hp_min = 300,
|
||||
xp_min = 50,
|
||||
xp_max = 50,
|
||||
armor = {undead = 80, fleshy = 80},
|
||||
armor = {undead = 80, fleshy = 100},
|
||||
-- This deviates from MC Wiki's size, which makes no sense
|
||||
collisionbox = {-0.9, 0.4, -0.9, 0.9, 2.45, 0.9},
|
||||
visual = "mesh",
|
||||
|
@ -66,6 +66,14 @@ mobs:register_mob("mobs_mc:wither", {
|
|||
run_start = 0, run_end = 20,
|
||||
},
|
||||
harmed_by_heal = true,
|
||||
do_custom = function(self)
|
||||
if self.health < (self.hp_max / 2) then
|
||||
self.base_texture = "mobs_mc_wither_half_health.png"
|
||||
self.fly = false
|
||||
self.object:set_properties({textures={self.base_texture}})
|
||||
self.armor = {undead = 80, fleshy = 80}
|
||||
end
|
||||
end,
|
||||
on_spawn = function(self)
|
||||
minetest.sound_play("mobs_mc_wither_spawn", {object=self.object, gain=1.0, max_hear_distance=64})
|
||||
end,
|
||||
|
|
|
@ -38,6 +38,7 @@ mcl_weather.reg_weathers["none"] = {
|
|||
local storage = minetest.get_mod_storage()
|
||||
-- Save weather into mod storage, so it can be loaded after restarting the server
|
||||
local save_weather = function()
|
||||
if not mcl_weather.end_time then return end
|
||||
storage:set_string("mcl_weather_state", mcl_weather.state)
|
||||
storage:set_int("mcl_weather_end_time", mcl_weather.end_time)
|
||||
minetest.log("verbose", "[mcl_weather] Weather data saved: state="..mcl_weather.state.." end_time="..mcl_weather.end_time)
|
||||
|
|
|
@ -1,13 +1,7 @@
|
|||
local S = minetest.get_translator("doc")
|
||||
local F = function(f) return minetest.formspec_escape(S(f)) end
|
||||
|
||||
-- Compability for 0.4.14 or earlier
|
||||
local colorize
|
||||
if minetest.colorize then
|
||||
colorize = minetest.colorize
|
||||
else
|
||||
colorize = function(color, text) return text end
|
||||
end
|
||||
local colorize = minetest.colorize
|
||||
|
||||
doc = {}
|
||||
|
||||
|
@ -41,10 +35,10 @@ doc.FORMSPEC.ENTRY_HEIGHT = doc.FORMSPEC.ENTRY_END_Y - doc.FORMSPEC.ENTRY_START_
|
|||
-- Internal helper variables
|
||||
local DOC_INTRO = S("This is the help.")
|
||||
|
||||
local COLOR_NOT_VIEWED = "#00FFFF" -- cyan
|
||||
local COLOR_VIEWED = "#FFFFFF" -- white
|
||||
local COLOR_HIDDEN = "#999999" -- gray
|
||||
local COLOR_ERROR = "#FF0000" -- red
|
||||
local COLOR_NOT_VIEWED = mcl_colors.AQUA
|
||||
local COLOR_VIEWED = mcl_colors.WHITE
|
||||
local COLOR_HIDDEN = mcl_colors.GRAY
|
||||
local COLOR_ERROR = mcl_colors.RED
|
||||
|
||||
local CATEGORYFIELDSIZE = {
|
||||
WIDTH = math.ceil(doc.FORMSPEC.WIDTH / 4),
|
||||
|
@ -776,7 +770,7 @@ function doc.generate_entry_list(cid, playername)
|
|||
if name == nil or name == "" then
|
||||
name = S("Nameless entry (@1)", eid)
|
||||
if doc.entry_viewed(playername, cid, eid) then
|
||||
viewedprefix = "#FF4444"
|
||||
viewedprefix = mcl_colors.RED
|
||||
else
|
||||
viewedprefix = COLOR_ERROR
|
||||
end
|
||||
|
|
|
@ -2,3 +2,4 @@ name = doc
|
|||
author = Wuzzy
|
||||
description = A simple in-game documentation system which enables mods to add help entries based on templates.
|
||||
optional_depends = unified_inventory, sfinv_buttons, central_message, inventory_plus
|
||||
depends = mcl_colors
|
||||
|
|
|
@ -410,7 +410,7 @@ local function get_tooltip(item, groups, cooktime, burntime)
|
|||
local tooltip
|
||||
|
||||
if groups then
|
||||
local gcol = "#FFAAFF"
|
||||
local gcol = mcl_colors.LIGHT_PURPLE
|
||||
if #groups == 1 then
|
||||
local g = group_names[groups[1]]
|
||||
local groupstr
|
||||
|
@ -446,12 +446,12 @@ local function get_tooltip(item, groups, cooktime, burntime)
|
|||
|
||||
if not groups and cooktime then
|
||||
tooltip = tooltip .. "\n" ..
|
||||
S("Cooking time: @1", colorize("yellow", cooktime))
|
||||
S("Cooking time: @1", colorize(mcl_colors.YELLOW, cooktime))
|
||||
end
|
||||
|
||||
if not groups and burntime then
|
||||
tooltip = tooltip .. "\n" ..
|
||||
S("Burning time: @1", colorize("yellow", burntime))
|
||||
S("Burning time: @1", colorize(mcl_colors.YELLOW, burntime))
|
||||
end
|
||||
|
||||
return fmt(FMT.tooltip, item, ESC(tooltip))
|
||||
|
@ -668,7 +668,7 @@ local function make_formspec(name)
|
|||
fs[#fs + 1] = fmt("label[%f,%f;%s]",
|
||||
sfinv_only and 6.3 or data.iX - 2.2,
|
||||
0.22,
|
||||
ESC(colorize("#383838", fmt("%s / %u", data.pagenum, data.pagemax))))
|
||||
ESC(colorize(mcl_colors.DARK_GRAY, fmt("%s / %u", data.pagenum, data.pagemax))))
|
||||
|
||||
fs[#fs + 1] = fmt([[
|
||||
image_button[%f,0.12;0.8,0.8;craftguide_prev_icon.png;prev;]
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name = mcl_craftguide
|
||||
author = kilbith
|
||||
description = The most comprehensive Crafting Guide on Minetest.
|
||||
depends = mcl_core, mcl_compass, mcl_clock, doc
|
||||
depends = mcl_core, mcl_compass, mcl_clock, doc, mcl_colors
|
||||
optional_depends = sfinv, sfinv_buttons
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = mcl_tt
|
||||
author = Wuzzy
|
||||
description = Add MCL2 tooltips
|
||||
depends = tt, mcl_enchanting
|
||||
depends = tt, mcl_enchanting, mcl_colors
|
||||
|
|
|
@ -77,7 +77,7 @@ end)
|
|||
tt.register_snippet(function(itemstring)
|
||||
local def = minetest.registered_items[itemstring]
|
||||
if minetest.get_item_group(itemstring, "crush_after_fall") == 1 then
|
||||
return S("Deals damage when falling"), "#FFFF00"
|
||||
return S("Deals damage when falling"), mcl_colors.YELLOW
|
||||
end
|
||||
end)
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
tt = {}
|
||||
tt.COLOR_DEFAULT = "#d0ffd0"
|
||||
tt.COLOR_DANGER = "#ffff00"
|
||||
tt.COLOR_GOOD = "#00ff00"
|
||||
tt.COLOR_DEFAULT = mcl_colors.GREEN
|
||||
tt.COLOR_DANGER = mcl_colors.YELLOW
|
||||
tt.COLOR_GOOD = mcl_colors.GREEN
|
||||
tt.NAME_COLOR = mcl_colors.YELLOW
|
||||
|
||||
-- API
|
||||
tt.registered_snippets = {}
|
||||
|
@ -63,12 +64,15 @@ tt.reload_itemstack_description = function(itemstack)
|
|||
local meta = itemstack:get_meta()
|
||||
if def and def._mcl_generate_description then
|
||||
def._mcl_generate_description(itemstack)
|
||||
elseif should_change(itemstring, def) and meta:get_string("name") == "" then
|
||||
elseif should_change(itemstring, def) then
|
||||
local toolcaps
|
||||
if def.tool_capabilities then
|
||||
toolcaps = itemstack:get_tool_capabilities()
|
||||
end
|
||||
local orig_desc = def._tt_original_description or def.description
|
||||
if meta:get_string("name") ~= "" then
|
||||
orig_desc = minetest.colorize(tt.NAME_COLOR, meta:get_string("name"))
|
||||
end
|
||||
local desc = apply_snippets(orig_desc, itemstring, toolcaps or def.tool_capabilities, itemstack)
|
||||
if desc ~= orig_desc then
|
||||
meta:set_string("description", desc)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
name = tt
|
||||
author = Wuzzy
|
||||
description = Support for custom tooltip extensions for items
|
||||
depends = mcl_colors
|
||||
|
|
|
@ -214,7 +214,7 @@ function awards.unlock(name, award)
|
|||
|
||||
-- Get award
|
||||
minetest.log("action", name.." has gotten award "..award)
|
||||
minetest.chat_send_all(S("@1 has made the achievement @2", name, minetest.colorize("#51EF4E", "[" .. (awdef.title or award) .. "]")))
|
||||
minetest.chat_send_all(S("@1 has made the achievement @2", name, minetest.colorize(mcl_colors.GREEN, "[" .. (awdef.title or award) .. "]")))
|
||||
data.unlocked[award] = award
|
||||
awards.save()
|
||||
|
||||
|
@ -447,7 +447,7 @@ function awards.getFormspec(name, to, sid)
|
|||
first = false
|
||||
|
||||
if def.secret and not award.got then
|
||||
formspec = formspec .. "#707070"..minetest.formspec_escape(S("(Secret Award)"))
|
||||
formspec = formspec .. mcl_colors.DARK_GRAY..minetest.formspec_escape(S("(Secret Award)"))
|
||||
else
|
||||
local title = award.name
|
||||
if def and def.title then
|
||||
|
@ -456,7 +456,7 @@ function awards.getFormspec(name, to, sid)
|
|||
if award.got then
|
||||
formspec = formspec .. minetest.formspec_escape(title)
|
||||
else
|
||||
formspec = formspec .. "#ACACAC".. minetest.formspec_escape(title)
|
||||
formspec = formspec .. mcl_colors.GRAY.. minetest.formspec_escape(title)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -6,3 +6,4 @@ license = LGPL 2.1 or later
|
|||
forum = https://forum.minetest.net/viewtopic.php?t=4870
|
||||
version = 2.3.0
|
||||
optional_depends = sfinv, unified_inventory
|
||||
depends = mcl_colors
|
||||
|
|
|
@ -238,3 +238,20 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||
awards.show_to(name, name, nil, false)
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
awards.register_achievement("mcl:stoneAge", {
|
||||
title = S("Stone Age"),
|
||||
description = S("Mine a stone with new pickaxe."),
|
||||
icon = "default_cobble.png",
|
||||
})
|
||||
awards.register_achievement("mcl:hotStuff", {
|
||||
title = S("Hot Stuff"),
|
||||
description = S("Put lava in a bucket."),
|
||||
icon = "bucket_lava.png",
|
||||
})
|
||||
awards.register_achievement("mcl:obsidian", {
|
||||
title = S("Ice Bucket Challenge"),
|
||||
description = S("Obtain an obsidian block."),
|
||||
icon = "default_obsidian.png",
|
||||
})
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
local S = minetest.get_translator("mcl_death_messages")
|
||||
local N = function(s) return s end
|
||||
local C = minetest.colorize
|
||||
|
||||
local color_skyblue = mcl_colors.AQUA
|
||||
|
||||
local function get_tool_name(item)
|
||||
local name = item:get_meta():get_string("name")
|
||||
|
@ -41,6 +44,9 @@ local msgs = {
|
|||
["murder"] = {
|
||||
N("@1 was slain by @2 using [@3]"),
|
||||
},
|
||||
["murder_hand"] = {
|
||||
N("@1 was slain by @2"),
|
||||
},
|
||||
["murder_any"] = {
|
||||
N("@1 was killed."),
|
||||
},
|
||||
|
@ -131,7 +137,7 @@ local last_damages = { }
|
|||
|
||||
minetest.register_on_dieplayer(function(player, reason)
|
||||
-- Death message
|
||||
local message = minetest.settings:get_bool("mcl_showDeathMessages")
|
||||
local message = minetest.settings:get_bool("mcl_showDeathMessages") --Maybe cache the setting?
|
||||
if message == nil then
|
||||
message = true
|
||||
end
|
||||
|
@ -201,7 +207,11 @@ minetest.register_on_dieplayer(function(player, reason)
|
|||
elseif hitter:is_player() then
|
||||
hittername = hitter:get_player_name()
|
||||
if hittername ~= nil then
|
||||
msg = dmsg("murder", name, hittername, minetest.colorize("#00FFFF", hitter_toolname))
|
||||
if hitter_toolname == "" then
|
||||
msg = dmsg("murder_hand", name, hittername)
|
||||
else
|
||||
msg = dmsg("murder", name, hittername, C(color_skyblue, hitter_toolname))
|
||||
end
|
||||
else
|
||||
msg = dmsg("murder_any", name)
|
||||
end
|
||||
|
@ -229,7 +239,7 @@ minetest.register_on_dieplayer(function(player, reason)
|
|||
if shooter == nil then
|
||||
msg = dmsg("arrow", name)
|
||||
elseif shooter:is_player() then
|
||||
msg = dmsg("arrow_name", name, shooter:get_player_name(), minetest.colorize("#00FFFF", get_tool_name(shooter:get_wielded_item())))
|
||||
msg = dmsg("arrow_name", name, shooter:get_player_name(), C(color_skyblue, get_tool_name(shooter:get_wielded_item())))
|
||||
elseif s_ent and s_ent._cmi_is_mob then
|
||||
if s_ent.nametag ~= "" then
|
||||
msg = dmsg("arrow_name", name, shooter:get_player_name(), get_tool_name(shooter:get_wielded_item()))
|
||||
|
|
|
@ -56,3 +56,4 @@ A ghast scared @1 to death.=Ein Ghast hat @1 zu Tode erschrocken.
|
|||
@1 was killed by a baby husk.=@1 wurde von einem Wüstenzombiebaby getötet.
|
||||
@1 was killed by a zombie pigman.=@1 wurde von einem Schweinezombie getötet.
|
||||
@1 was killed by a baby zombie pigman.=@1 wurde von einem Schweinezombiebaby getötet.
|
||||
@1 was slain by @2.=
|
||||
|
|
|
@ -55,3 +55,4 @@ A ghast scared @1 to death.=Se ha asustado @1 hasta morir.
|
|||
@1 was killed by a baby husk.=@1 fue asesinado por un bebé husk.
|
||||
@1 was killed by a zombie pigman.=@1 fue asesinado por un cerdo zombie.
|
||||
@1 was killed by a baby zombie pigman.=@1 fue asesinado por un bebé cerdo zombie.
|
||||
@1 was slain by @2.=
|
||||
|
|
|
@ -56,3 +56,4 @@ A ghast scared @1 to death.=Un ghast a éffrayé @1 à mort.
|
|||
@1 was killed by a baby husk.=@1 a été tué par un bébé zombie momie.
|
||||
@1 was killed by a zombie pigman.=@1 a été tué par un zombie-couchon.
|
||||
@1 was killed by a baby zombie pigman.=@1 a été tué par un bébé zombie-couchon
|
||||
@1 was slain by @2.=
|
||||
|
|
|
@ -56,3 +56,4 @@ A ghast scared @1 to death.=Гаст напугал @1 до смерти.
|
|||
@1 was killed by a baby husk.=@1 был(а) убит(а) машылом-кадавром.
|
||||
@1 was killed by a zombie pigman.=@1 был(а) убит(а) зомби-свиночеловеком.
|
||||
@1 was killed by a baby zombie pigman.=@1 был(а) убит(а) малышом-зомби-свиночеловеком.
|
||||
@1 was slain by @2.=
|
||||
|
|
|
@ -56,3 +56,4 @@ A ghast scared @1 to death.=
|
|||
@1 was killed by a baby husk.=
|
||||
@1 was killed by a zombie pigman.=
|
||||
@1 was killed by a baby zombie pigman.=
|
||||
@1 was slain by @2.=
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
name = mcl_death_messages
|
||||
author = 4Evergreen4
|
||||
description = Shows messages in chat when a player dies.
|
||||
depends = mcl_colors
|
||||
|
|
|
@ -442,7 +442,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz
|
|||
end
|
||||
local caption = ""
|
||||
if name ~= "inv" and filtername[name] then
|
||||
caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]"
|
||||
caption = "label[0,1.2;"..F(minetest.colorize(mcl_colors.DARK_GRAY, filtername[name])).."]"
|
||||
end
|
||||
|
||||
formspec = "size[10,9.3]"..
|
||||
|
@ -489,8 +489,8 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz
|
|||
if filter == nil then
|
||||
filter = ""
|
||||
end
|
||||
formspec = formspec .. "field[5.3,1.34;4,0.75;suche;;"..minetest.formspec_escape(filter).."]"
|
||||
formspec = formspec .. "field_close_on_enter[suche;false]"
|
||||
formspec = formspec .. "field[5.3,1.34;4,0.75;search;;"..minetest.formspec_escape(filter).."]"
|
||||
formspec = formspec .. "field_close_on_enter[search;false]"
|
||||
end
|
||||
if pagenum ~= nil then formspec = formspec .. "p"..tostring(pagenum) end
|
||||
|
||||
|
@ -561,11 +561,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||
elseif fields.inv then
|
||||
if players[name].page == "inv" then return end
|
||||
page = "inv"
|
||||
elseif fields.suche == "" and not fields.creative_next and not fields.creative_prev then
|
||||
elseif fields.search == "" and not fields.creative_next and not fields.creative_prev then
|
||||
set_inv_page("all", player)
|
||||
page = "nix"
|
||||
elseif fields.suche ~= nil and not fields.creative_next and not fields.creative_prev then
|
||||
set_inv_search(string.lower(fields.suche),player)
|
||||
elseif fields.search ~= nil and not fields.creative_next and not fields.creative_prev then
|
||||
set_inv_search(string.lower(fields.search),player)
|
||||
page = "nix"
|
||||
end
|
||||
|
||||
|
@ -612,8 +612,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||
players[name].start_i = start_i
|
||||
|
||||
local filter = ""
|
||||
if not fields.nix and fields.suche ~= nil and fields.suche ~= "" then
|
||||
filter = fields.suche
|
||||
if not fields.nix and fields.search ~= nil and fields.search ~= "" then
|
||||
filter = fields.search
|
||||
players[name].filter = filter
|
||||
end
|
||||
|
||||
|
|
|
@ -109,10 +109,10 @@ local function set_inventory(player, armor_change_only)
|
|||
mcl_formspec.get_itemslot_bg(0,3,1,1)..
|
||||
armor_slot_imgs..
|
||||
-- craft and inventory
|
||||
"label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[0,4;"..F(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
"list[current_player;main;0,7.74;9,1;]"..
|
||||
"label[4,0.5;"..F(minetest.colorize("#313131", S("Crafting"))).."]"..
|
||||
"label[4,0.5;"..F(minetest.colorize(mcl_colors.DARK_GRAY, S("Crafting"))).."]"..
|
||||
"list[current_player;craft;4,1;2,2]"..
|
||||
"list[current_player;craftpreview;7,1.5;1,1;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
name = mcl_inventory
|
||||
author = BlockMen
|
||||
description = Adds the player inventory and creative inventory.
|
||||
depends = mcl_init, mcl_formspec
|
||||
depends = mcl_init, mcl_formspec, mcl_colors
|
||||
optional_depends = mcl_player, _mcl_autogroup, mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
# mcl_temp_message
|
||||
|
||||
Allow mods to show short messages in the hud of players.
|
||||
|
||||
## mcl_tmp_message.message(player, message)
|
||||
|
||||
Show above the hotbar a hud message <message> to player <player>.
|
|
@ -13,12 +13,12 @@ local S = minetest.get_translator("mcl_dispensers")
|
|||
local setup_dispenser = function(pos)
|
||||
-- Set formspec and inventory
|
||||
local form = "size[9,8.75]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
|
||||
"list[current_player;main;0,7.74;9,1;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,7.74,9,1)..
|
||||
"label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dispenser"))).."]"..
|
||||
"label[3,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Dispenser"))).."]"..
|
||||
"list[current_name;main;3,0.5;3,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(3,0.5,3,3)..
|
||||
"listring[current_name;main]"..
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
name = mcl_dispensers
|
||||
depends = mcl_init, mcl_formspec, mesecons, mcl_sounds, mcl_tnt, mcl_worlds, mcl_core, mcl_nether, mcl_armor_stand, mcl_armor
|
||||
depends = mcl_init, mcl_formspec, mesecons, mcl_sounds, mcl_tnt, mcl_worlds, mcl_core, mcl_nether, mcl_armor_stand, mcl_armor, mcl_colors
|
||||
optional_depends = doc, screwdriver
|
||||
|
|
|
@ -14,12 +14,12 @@ local S = minetest.get_translator("mcl_droppers")
|
|||
local setup_dropper = function(pos)
|
||||
-- Set formspec and inventory
|
||||
local form = "size[9,8.75]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
|
||||
"list[current_player;main;0,7.74;9,1;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,7.74,9,1)..
|
||||
"label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]"..
|
||||
"label[3,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Dropper"))).."]"..
|
||||
"list[current_name;main;3,0.5;3,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(3,0.5,3,3)..
|
||||
"listring[current_name;main]"..
|
||||
|
|
|
@ -15,10 +15,10 @@ local setup_dropper = function(pos)
|
|||
-- Set formspec and inventory
|
||||
local form = "size[9,8.75]"..
|
||||
"background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
"list[current_player;main;0,7.74;9,1;]"..
|
||||
"label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]"..
|
||||
"label[3,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Dropper"))).."]"..
|
||||
"list[current_name;main;3,0.5;3,3;]"..
|
||||
"listring[current_name;main]"..
|
||||
"listring[current_player;main]"
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
name = mcl_droppers
|
||||
depends = mcl_init, mcl_formspec, mesecons, mcl_util
|
||||
depends = mcl_init, mcl_formspec, mesecons, mcl_util, mcl_colors
|
||||
optional_depends = doc, screwdriver
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
local S = minetest.get_translator("mesecons_commandblock")
|
||||
local F = minetest.formspec_escape
|
||||
|
||||
local color_red = mcl_colors.RED
|
||||
|
||||
local command_blocks_activated = minetest.settings:get_bool("mcl_enable_commandblocks", true)
|
||||
local msg_not_activated = S("Command blocks are not enabled on this server")
|
||||
|
||||
local function construct(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
||||
|
@ -78,7 +83,7 @@ local function check_commands(commands, player_name)
|
|||
if string.sub(cmd, 1, 1) == "/" then
|
||||
msg = S("Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.", cmd)
|
||||
end
|
||||
return false, minetest.colorize("#FF0000", msg)
|
||||
return false, minetest.colorize(color_red, msg)
|
||||
end
|
||||
if player_name then
|
||||
local player_privs = minetest.get_player_privs(player_name)
|
||||
|
@ -86,7 +91,7 @@ local function check_commands(commands, player_name)
|
|||
for cmd_priv, _ in pairs(cmddef.privs) do
|
||||
if player_privs[cmd_priv] ~= true then
|
||||
local msg = S("Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.", cmd, cmd_priv)
|
||||
return false, minetest.colorize("#FF0000", msg)
|
||||
return false, minetest.colorize(color_red, msg)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -98,10 +103,15 @@ local function commandblock_action_on(pos, node)
|
|||
if node.name ~= "mesecons_commandblock:commandblock_off" then
|
||||
return
|
||||
end
|
||||
|
||||
minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_on"})
|
||||
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
local commander = meta:get_string("commander")
|
||||
|
||||
if not command_blocks_activated then
|
||||
--minetest.chat_send_player(commander, msg_not_activated)
|
||||
return
|
||||
end
|
||||
minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_on"})
|
||||
|
||||
local commands = resolve_commands(meta:get_string("commands"), pos)
|
||||
for _, command in pairs(commands:split("\n")) do
|
||||
|
@ -117,7 +127,6 @@ local function commandblock_action_on(pos, node)
|
|||
return
|
||||
end
|
||||
-- Execute command in the name of commander
|
||||
local commander = meta:get_string("commander")
|
||||
cmddef.func(commander, param)
|
||||
end
|
||||
end
|
||||
|
@ -129,6 +138,10 @@ local function commandblock_action_off(pos, node)
|
|||
end
|
||||
|
||||
local on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
||||
if not command_blocks_activated then
|
||||
minetest.chat_send_player(player:get_player_name(), msg_not_activated)
|
||||
return
|
||||
end
|
||||
local can_edit = true
|
||||
-- Only allow write access in Creative Mode
|
||||
if not minetest.is_creative_enabled(player:get_player_name()) then
|
||||
|
|
|
@ -27,3 +27,4 @@ Access denied. You need the “maphack” privilege to edit command blocks.=Zugr
|
|||
Editing the command block has failed! You can only change the command block in Creative Mode!=Bearbeitung des Befehlsblocks fehlgeschlagen! Sie können den Befehlsblock nur im Kreativmodus ändern!
|
||||
Editing the command block has failed! The command block is gone.=Bearbeiten des Befehlsblocks fehlgeschlagen! Der Befehlsblock ist verschwunden.
|
||||
Executes server commands when powered by redstone power=Führt Serverbefehle aus, wenn mit Redstoneenergie versorgt
|
||||
Command blocks are not enabled on this server=
|
||||
|
|
|
@ -28,3 +28,4 @@ Example 2:@n give @@n mcl_core:apple 5@nGives the nearest player 5 apples=2.
|
|||
Access denied. You need the “maphack” privilege to edit command blocks.=Acceso denegado. Necesita el privilegio "maphack" para editar bloques de comandos.
|
||||
Editing the command block has failed! You can only change the command block in Creative Mode!=¡La edición del bloque de comando ha fallado! ¡Solo puede cambiar el bloque de comandos en modo creativo!
|
||||
Editing the command block has failed! The command block is gone.=¡La edición del bloque de comando ha fallado! El bloque de comando se ha ido.
|
||||
Command blocks are not enabled on this server=
|
||||
|
|
|
@ -27,3 +27,4 @@ Access denied. You need the “maphack” privilege to edit command blocks.=Acc
|
|||
Editing the command block has failed! You can only change the command block in Creative Mode!=La modification du bloc de commandes a échoué! Vous ne pouvez modifier le bloc de commandes qu'en mode créatif!
|
||||
Editing the command block has failed! The command block is gone.=La modification du bloc de commandes a échoué! Le bloc de commande a disparu.
|
||||
Executes server commands when powered by redstone power=Exécute les commandes du serveur lorsqu'il est alimenté par l'alimentation Redstone
|
||||
Command blocks are not enabled on this server=Les blocks de commandes ne sont pas activés sur ce serveur
|
||||
|
|
|
@ -27,3 +27,4 @@ Access denied. You need the “maphack” privilege to edit command blocks.=До
|
|||
Editing the command block has failed! You can only change the command block in Creative Mode!=Попытка редактирования командного блока потерпела неудачу. Вы можете изменять командные блоки только в творческом режиме!
|
||||
Editing the command block has failed! The command block is gone.=Попытка редактирования командного блока потерпела неудачу. Командный блок исчез.
|
||||
Executes server commands when powered by redstone power=При подаче энергии редстоуна выполняет серверные команды
|
||||
Command blocks are not enabled on this server=
|
||||
|
|
|
@ -27,3 +27,4 @@ Access denied. You need the “maphack” privilege to edit command blocks.=
|
|||
Editing the command block has failed! You can only change the command block in Creative Mode!=
|
||||
Editing the command block has failed! The command block is gone.=
|
||||
Executes server commands when powered by redstone power=
|
||||
Command blocks are not enabled on this server=
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
name = mesecons_commandblock
|
||||
depends = mesecons
|
||||
depends = mesecons, mcl_colors
|
||||
optional_depends = doc, doc_items
|
||||
|
|
|
@ -9,7 +9,6 @@ local MATERIAL_TOOL_REPAIR_BOOST = {
|
|||
math.ceil(MAX_WEAR * 0.75), -- 75%
|
||||
MAX_WEAR, -- 100%
|
||||
}
|
||||
local NAME_COLOR = "#FFFF4C"
|
||||
|
||||
local function get_anvil_formspec(set_name)
|
||||
if not set_name then
|
||||
|
@ -17,7 +16,7 @@ local function get_anvil_formspec(set_name)
|
|||
end
|
||||
return "size[9,8.75]"..
|
||||
"background[-0.19,-0.25;9.41,9.49;mcl_anvils_inventory.png]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
|
||||
"list[current_player;main;0,7.74;9,1;]"..
|
||||
|
@ -28,7 +27,7 @@ local function get_anvil_formspec(set_name)
|
|||
mcl_formspec.get_itemslot_bg(4,2.5,1,1)..
|
||||
"list[context;output;8,2.5;1,1;]"..
|
||||
mcl_formspec.get_itemslot_bg(8,2.5,1,1)..
|
||||
"label[3,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Repair and Name"))).."]"..
|
||||
"label[3,0.1;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Repair and Name"))).."]"..
|
||||
"field[3.25,1;4,1;name;;"..minetest.formspec_escape(set_name).."]"..
|
||||
"field_close_on_enter[name;false]"..
|
||||
"button[7,0.7;2,1;name_button;"..minetest.formspec_escape(S("Set Name")).."]"..
|
||||
|
@ -172,14 +171,8 @@ local function update_anvil_slots(meta)
|
|||
if new_name ~= old_name then
|
||||
-- Save the raw name internally
|
||||
meta:set_string("name", new_name)
|
||||
-- Rename item
|
||||
if new_name == "" then
|
||||
tt.reload_itemstack_description(name_item)
|
||||
else
|
||||
-- Custom name set. Colorize it!
|
||||
-- This makes the name visually different from unnamed items
|
||||
meta:set_string("description", minetest.colorize(NAME_COLOR, new_name))
|
||||
end
|
||||
-- Rename item handled by tt
|
||||
tt.reload_itemstack_description(name_item)
|
||||
new_output = name_item
|
||||
elseif just_rename then
|
||||
new_output = ""
|
||||
|
@ -495,7 +488,6 @@ S("The anvil has limited durability and 3 damage levels: undamaged, slightly dam
|
|||
local anvildef1 = table.copy(anvildef)
|
||||
anvildef1.description = S("Slightly Damaged Anvil")
|
||||
anvildef1._doc_items_create_entry = false
|
||||
anvildef1.groups.not_in_creative_inventory = 1
|
||||
anvildef1.groups.anvil = 2
|
||||
anvildef1._doc_items_create_entry = false
|
||||
anvildef1.tiles = {"mcl_anvils_anvil_top_damaged_1.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"}
|
||||
|
@ -503,7 +495,6 @@ anvildef1.tiles = {"mcl_anvils_anvil_top_damaged_1.png^[transformR90", "mcl_anvi
|
|||
local anvildef2 = table.copy(anvildef)
|
||||
anvildef2.description = S("Very Damaged Anvil")
|
||||
anvildef2._doc_items_create_entry = false
|
||||
anvildef2.groups.not_in_creative_inventory = 1
|
||||
anvildef2.groups.anvil = 3
|
||||
anvildef2._doc_items_create_entry = false
|
||||
anvildef2.tiles = {"mcl_anvils_anvil_top_damaged_2.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name = mcl_anvils
|
||||
author = Wuzzy
|
||||
description = Anvils mods for MCL2
|
||||
depends = mcl_init, mcl_formspec, mcl_sounds, tt, mcl_enchanting
|
||||
depends = mcl_init, mcl_formspec, mcl_sounds, tt, mcl_enchanting, mcl_colors
|
||||
optional_depends = mcl_core, screwdriver
|
||||
|
|
|
@ -367,6 +367,7 @@ mcl_player.player_register_model("mcl_armor_character.b3d", {
|
|||
run_walk = {x=440, y=459},
|
||||
run_walk_mine = {x=461, y=480},
|
||||
sit_mount = {x=484, y=484},
|
||||
die = {x=498, y=498},
|
||||
},
|
||||
})
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,4 +1,5 @@
|
|||
name = mcl_banners
|
||||
author = 22i
|
||||
description = Adds decorative banners in different colors which can be emblazoned with patterns, offering a countless number of combinations.
|
||||
depends = mcl_colors
|
||||
optional_depends = mcl_sounds, mcl_core, mcl_wool, mcl_cauldrons, doc, screwdriver
|
||||
|
|
|
@ -281,7 +281,7 @@ mcl_banners.make_advanced_banner_description = function(description, layers)
|
|||
|
||||
-- Final string concatenations: Just a list of strings
|
||||
local append = table.concat(layerstrings, "\n")
|
||||
description = description .. "\n" .. minetest.colorize("#8F8F8F", append)
|
||||
description = description .. "\n" .. minetest.colorize(mcl_colors.GRAY, append)
|
||||
return description
|
||||
end
|
||||
end
|
||||
|
|
|
@ -89,6 +89,7 @@ function mcl_beds.register_bed(name, def)
|
|||
selection_box = selection_box_bottom,
|
||||
collision_box = collision_box_bottom,
|
||||
drop = "",
|
||||
node_placement_prediction = "",
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local under = pointed_thing.under
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
local S =minetest.get_translator("mcl_books")
|
||||
local S = minetest.get_translator("mcl_books")
|
||||
|
||||
local max_text_length = 4500 -- TODO: Increase to 12800 when scroll bar was added to written book
|
||||
local max_title_length = 64
|
||||
|
@ -67,7 +67,7 @@ local make_description = function(title, author, generation)
|
|||
else
|
||||
desc = S("Tattered Book")
|
||||
end
|
||||
desc = desc .. "\n" .. minetest.colorize("#AAAAAA", S("by @1", author))
|
||||
desc = desc .. "\n" .. minetest.colorize(mcl_colors.GRAY, S("by @1", author))
|
||||
return desc
|
||||
end
|
||||
|
||||
|
@ -147,8 +147,8 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields )
|
|||
local formspec = "size[8,9]"..
|
||||
header..
|
||||
"background[-0.5,-0.5;9,10;mcl_books_book_bg.png]"..
|
||||
"field[0.75,1;7.25,1;title;"..minetest.formspec_escape(minetest.colorize("#000000", S("Enter book title:")))..";]"..
|
||||
"label[0.75,1.5;"..minetest.formspec_escape(minetest.colorize("#404040", S("by @1", name))).."]"..
|
||||
"field[0.75,1;7.25,1;title;"..minetest.formspec_escape(minetest.colorize(mcl_colors.BLACK, S("Enter book title:")))..";]"..
|
||||
"label[0.75,1.5;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("by @1", name))).."]"..
|
||||
"button_exit[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign and Close")).."]"..
|
||||
"tooltip[sign;"..minetest.formspec_escape(S("Note: The book will no longer be editable after signing")).."]"..
|
||||
"button[4.25,7.95;3,1;cancel;"..minetest.formspec_escape(S("Cancel")).."]"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = mcl_books
|
||||
author = celeron55
|
||||
description = Books mod for MCL2
|
||||
optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye
|
||||
optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye, mcl_colors
|
||||
|
|
|
@ -16,23 +16,17 @@ local dir_to_pitch = function(dir)
|
|||
end
|
||||
|
||||
local random_arrow_positions = function(positions, placement)
|
||||
local min = 0
|
||||
local max = 0
|
||||
if positions == 'x' then
|
||||
min = -4
|
||||
max = 4
|
||||
return math.random(-4, 4)
|
||||
elseif positions == 'y' then
|
||||
min = 0
|
||||
max = 10
|
||||
return math.random(0, 10)
|
||||
end
|
||||
if placement == 'front' and positions == 'z' then
|
||||
min = 3
|
||||
max = 3
|
||||
return 3
|
||||
elseif placement == 'back' and positions == 'z' then
|
||||
min = -3
|
||||
max = -3
|
||||
return -3
|
||||
end
|
||||
return math.random(max, min)
|
||||
return 0
|
||||
end
|
||||
|
||||
local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements")
|
||||
|
@ -304,8 +298,8 @@ ARROW_ENTITY.on_step = function(self, dtime)
|
|||
else
|
||||
self._attach_parent = 'Body'
|
||||
end
|
||||
self._z_rotation = math.random(30, -30)
|
||||
self._y_rotation = math.random(30, -30)
|
||||
self._z_rotation = math.random(-30, 30)
|
||||
self._y_rotation = math.random( -30, 30)
|
||||
self.object:set_attach(obj, self._attach_parent, {x=self._x_position,y=self._y_position,z=random_arrow_positions('z', placement)}, {x=0,y=self._rotation_station + self._y_rotation,z=self._z_rotation})
|
||||
minetest.after(150, function()
|
||||
self.object:remove()
|
||||
|
|
|
@ -4,8 +4,8 @@ local function active_brewing_formspec(fuel_percent, brew_percent)
|
|||
|
||||
return "size[9,8.75]"..
|
||||
"background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]"..
|
||||
"label[4,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Brewing Stand"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[4,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Brewing Stand"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
|
||||
"list[current_player;main;0,7.75;9,1;]"..
|
||||
|
@ -35,8 +35,8 @@ end
|
|||
|
||||
local brewing_formspec = "size[9,8.75]"..
|
||||
"background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]"..
|
||||
"label[4,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Brewing Stand"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[4,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Brewing Stand"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
|
||||
"list[current_player;main;0,7.75;9,1;]"..
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = mcl_brewing
|
||||
author = bzoss
|
||||
depends = mcl_init, mcl_formspec, mcl_sounds, mcl_potions, mcl_mobitems
|
||||
depends = mcl_init, mcl_formspec, mcl_sounds, mcl_potions, mcl_mobitems, mcl_colors
|
||||
optional_depends = mcl_core, doc, screwdriver
|
||||
|
|
|
@ -5,17 +5,17 @@ Add an API to register buckets to mcl
|
|||
|
||||
Register a new liquid
|
||||
Accept folowing params:
|
||||
* source_place = a string or function.
|
||||
* source_place: a string or function.
|
||||
* string: name of the node to place
|
||||
* function(pos): will returns name of the node to place with pos being the placement position
|
||||
* source_take = table of liquid source node names to take
|
||||
* itemname = itemstring of the new bucket item (or nil if liquid is not takeable)
|
||||
* inventory_image = texture of the new bucket item (ignored if itemname == nil)
|
||||
* name = user-visible bucket description
|
||||
* longdesc = long explanatory description (for help)
|
||||
* usagehelp = short usage explanation (for help)
|
||||
* tt_help = very short tooltip help
|
||||
* extra_check(pos, placer) = optional function(pos) which can returns false to avoid placing the liquid. Placer is object/player who is placing the liquid, can be nil.
|
||||
* groups = optional list of item groups
|
||||
* source_take: table of liquid source node names to take
|
||||
* itemname: itemstring of the new bucket item (or nil if liquid is not takeable)
|
||||
* inventory_image: texture of the new bucket item (ignored if itemname == nil)
|
||||
* name: user-visible bucket description
|
||||
* longdesc: long explanatory description (for help)
|
||||
* usagehelp: short usage explanation (for help)
|
||||
* tt_help: very short tooltip help
|
||||
* extra_check(pos, placer): (optional) function(pos) which can returns false to avoid placing the liquid. Placer is object/player who is placing the liquid, can be nil.
|
||||
* groups: optional list of item groups
|
||||
|
||||
This function can be called from any mod (which depends on this one)
|
|
@ -207,6 +207,9 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", {
|
|||
-- Fill bucket, but not in Creative Mode
|
||||
if not minetest.is_creative_enabled(user:get_player_name()) then
|
||||
new_bucket = ItemStack({name = liquiddef.itemname})
|
||||
if liquiddef.itemname == "mcl_buckets:bucket_lava" and awards and awards.unlock and user and user:is_player() then
|
||||
awards.unlock(user:get_player_name(), "mcl:hotStuff")
|
||||
end
|
||||
end
|
||||
|
||||
minetest.add_node(pointed_thing.under, {name="air"})
|
||||
|
|
|
@ -475,10 +475,10 @@ minetest.register_node(small_name, {
|
|||
minetest.show_formspec(clicker:get_player_name(),
|
||||
"mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z,
|
||||
"size[9,8.75]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]"..
|
||||
"list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,0.5,9,3)..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
|
||||
"list[current_player;main;0,7.74;9,1;]"..
|
||||
|
@ -624,12 +624,12 @@ minetest.register_node(left_name, {
|
|||
minetest.show_formspec(clicker:get_player_name(),
|
||||
"mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z,
|
||||
"size[9,11.5]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]"..
|
||||
"list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,0.5,9,3)..
|
||||
"list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,3.5,9,3)..
|
||||
"label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[0,7;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,7.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,7.5,9,3)..
|
||||
"list[current_player;main;0,10.75;9,1;]"..
|
||||
|
@ -773,12 +773,12 @@ minetest.register_node("mcl_chests:"..basename.."_right", {
|
|||
"mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z,
|
||||
|
||||
"size[9,11.5]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]"..
|
||||
"list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,0.5,9,3)..
|
||||
"list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,3.5,9,3)..
|
||||
"label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[0,7;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,7.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,7.5,9,3)..
|
||||
"list[current_player;main;0,10.75;9,1;]"..
|
||||
|
@ -986,10 +986,10 @@ minetest.register_node("mcl_chests:ender_chest", {
|
|||
})
|
||||
|
||||
local formspec_ender_chest = "size[9,8.75]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Ender Chest"))).."]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Ender Chest"))).."]"..
|
||||
"list[current_player;enderchest;0,0.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,0.5,9,3)..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
|
||||
"list[current_player;main;0,7.74;9,1;]"..
|
||||
|
@ -1104,10 +1104,10 @@ local function formspec_shulker_box(name)
|
|||
name = S("Shulker Box")
|
||||
end
|
||||
return "size[9,8.75]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]"..
|
||||
"label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]"..
|
||||
"list[current_name;main;0,0.5;9,3;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,0.5,9,3)..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
|
||||
"list[current_player;main;0,7.74;9,1;]"..
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
name = mcl_chests
|
||||
depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_end, mesecons
|
||||
depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_end, mesecons, mcl_colors
|
||||
optional_depends = doc, screwdriver
|
||||
|
|
|
@ -14,7 +14,7 @@ mcl_autogroup.register_diggroup("shearsy_wool")
|
|||
mcl_autogroup.register_diggroup("shearsy_cobweb")
|
||||
mcl_autogroup.register_diggroup("swordy")
|
||||
mcl_autogroup.register_diggroup("swordy_cobweb")
|
||||
mcl_autogroup.register_diggroup("creative_breakable")
|
||||
mcl_autogroup.register_diggroup("hoey")
|
||||
|
||||
-- Load files
|
||||
local modpath = minetest.get_modpath("mcl_core")
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = mcl_core
|
||||
description = Core items of MineClone 2: Basic biome blocks (dirt, sand, stones, etc.), derived items, glass, sugar cane, cactus, barrier, mining tools, hand, craftitems, and misc. items which don't really fit anywhere else.
|
||||
depends = mcl_autogroup, mcl_init, mcl_sounds, mcl_particles, mcl_util, mcl_worlds, doc_items, mcl_enchanting
|
||||
depends = mcl_autogroup, mcl_init, mcl_sounds, mcl_particles, mcl_util, mcl_worlds, doc_items, mcl_enchanting, mcl_colors
|
||||
optional_depends = doc
|
||||
|
|
|
@ -33,6 +33,11 @@ minetest.register_node("mcl_core:stone", {
|
|||
_mcl_blast_resistance = 6,
|
||||
_mcl_hardness = 1.5,
|
||||
_mcl_silk_touch_drop = true,
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
if awards and awards.unlock and digger and digger:is_player() then
|
||||
awards.unlock(digger:get_player_name(), "mcl:stoneAge")
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_core:stone_with_coal", {
|
||||
|
@ -808,12 +813,17 @@ minetest.register_node("mcl_core:obsidian", {
|
|||
description = S("Obsidian"),
|
||||
_doc_items_longdesc = S("Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava."),
|
||||
tiles = {"default_obsidian.png"},
|
||||
is_ground_content = true,
|
||||
is_ground_content = false,
|
||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||
stack_max = 64,
|
||||
groups = {pickaxey=5, building_block=1, material_stone=1},
|
||||
_mcl_blast_resistance = 1200,
|
||||
_mcl_hardness = 50,
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
if awards and awards.unlock and digger and digger:is_player() then
|
||||
awards.unlock(digger:get_player_name(), "mcl:obsidian")
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_core:ice", {
|
||||
|
|
|
@ -4,7 +4,7 @@ local S = minetest.get_translator("mcl_core")
|
|||
|
||||
minetest.register_node("mcl_core:cactus", {
|
||||
description = S("Cactus"),
|
||||
_tt_help = S("Grows on sand").."\n"..minetest.colorize("#FFFF00", S("Contact damage: @1 per half second", 1)),
|
||||
_tt_help = S("Grows on sand").."\n"..minetest.colorize(mcl_colors.YELLOW, S("Contact damage: @1 per half second", 1)),
|
||||
_doc_items_longdesc = S("This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well."),
|
||||
_doc_items_usagehelp = S("A cactus can only be placed on top of another cactus or any sand."),
|
||||
drawtype = "nodebox",
|
||||
|
|
|
@ -236,7 +236,7 @@ minetest.register_node("mcl_core:realm_barrier", {
|
|||
-- Prevent placement to protect player from screwing up the world, because the node is not pointable and hard to get rid of.
|
||||
node_placement_prediction = "",
|
||||
on_place = function(pos, placer, itemstack, pointed_thing)
|
||||
minetest.chat_send_player(placer:get_player_name(), minetest.colorize("#FF0000", "You can't just place a realm barrier by hand!"))
|
||||
minetest.chat_send_player(placer:get_player_name(), minetest.colorize(mcl_colors.RED, "You can't just place a realm barrier by hand!"))
|
||||
return
|
||||
end,
|
||||
})
|
||||
|
@ -266,7 +266,7 @@ minetest.register_node("mcl_core:void", {
|
|||
-- Prevent placement to protect player from screwing up the world, because the node is not pointable and hard to get rid of.
|
||||
node_placement_prediction = "",
|
||||
on_place = function(pos, placer, itemstack, pointed_thing)
|
||||
minetest.chat_send_player(placer:get_player_name(), minetest.colorize("#FF0000", "You can't just place the void by hand!"))
|
||||
minetest.chat_send_player(placer:get_player_name(), minetest.colorize(mcl_colors.RED, "You can't just place the void by hand!"))
|
||||
return
|
||||
end,
|
||||
drop = "",
|
||||
|
|
|
@ -108,7 +108,19 @@ local register_leaves = function(subname, description, longdesc, tiles, sapling,
|
|||
tiles = tiles,
|
||||
paramtype = "light",
|
||||
stack_max = 64,
|
||||
groups = {handy=1,shearsy=1,swordy=1, leafdecay=leafdecay_distance, flammable=2, leaves=1, deco_block=1, dig_by_piston=1, fire_encouragement=30, fire_flammability=60},
|
||||
groups = {
|
||||
handy=1,
|
||||
hoey=1,
|
||||
shearsy=1,
|
||||
swordy=1,
|
||||
leafdecay=leafdecay_distance,
|
||||
flammable=2,
|
||||
leaves=1,
|
||||
deco_block=1,
|
||||
dig_by_piston=1,
|
||||
fire_encouragement=30,
|
||||
fire_flammability=60
|
||||
},
|
||||
drop = get_drops(0),
|
||||
_mcl_shears_drop = true,
|
||||
sounds = mcl_sounds.node_sound_leaves_defaults(),
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
# mcl_crafting_table
|
||||
Add a node which allow players to craft more complex things.
|
||||
|
||||
## mcl_crafting_table.show_crafting_form(player)
|
||||
Show the crafting form to a player.
|
||||
Used in the node registration, but can be used by external mods.
|
|
@ -2,7 +2,7 @@ local S = minetest.get_translator("mcl_crafting_table")
|
|||
local formspec_escape = minetest.formspec_escape
|
||||
local show_formspec = minetest.show_formspec
|
||||
local C = minetest.colorize
|
||||
local text_color = mcl_colors.BLACK or "#313131"
|
||||
local text_color = mcl_colors.DARK_GRAY
|
||||
local itemslot_bg = mcl_formspec.get_itemslot_bg
|
||||
|
||||
mcl_crafting_table = {}
|
||||
|
@ -13,7 +13,7 @@ function mcl_crafting_table.show_crafting_form(player)
|
|||
show_formspec(player:get_player_name(), "main",
|
||||
"size[9,8.75]"..
|
||||
"image[4.7,1.5;1.5,1;gui_crafting_arrow.png]"..
|
||||
"label[0,4;"..formspec_escape(C(text_color, S("Inventory"))).."]".. --"#313131"
|
||||
"label[0,4;"..formspec_escape(C(text_color, S("Inventory"))).."]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
itemslot_bg(0,4.5,9,3)..
|
||||
"list[current_player;main;0,7.74;9,1;]"..
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
name = mcl_crafting_table
|
||||
description = Adds a crafting table.
|
||||
depends = mcl_init, mcl_formspec, mcl_sounds
|
||||
optional_depends = mcl_colors
|
||||
depends = mcl_init, mcl_formspec, mcl_sounds, mcl_colors
|
||||
|
|
|
@ -52,7 +52,7 @@ function mcl_enchanting.get_enchantment_description(enchantment, level)
|
|||
end
|
||||
|
||||
function mcl_enchanting.get_colorized_enchantment_description(enchantment, level)
|
||||
return minetest.colorize(mcl_enchanting.enchantments[enchantment].curse and "#FC5454" or "#A8A8A8", mcl_enchanting.get_enchantment_description(enchantment, level))
|
||||
return minetest.colorize(mcl_enchanting.enchantments[enchantment].curse and mcl_colors.RED or mcl_colors.GRAY, mcl_enchanting.get_enchantment_description(enchantment, level))
|
||||
end
|
||||
|
||||
function mcl_enchanting.get_enchanted_itemstring(itemname)
|
||||
|
@ -468,13 +468,13 @@ function mcl_enchanting.show_enchanting_formspec(player)
|
|||
local formspec = ""
|
||||
.. "size[9.07,8.6;]"
|
||||
.. "formspec_version[3]"
|
||||
.. "label[0,0;" .. C("#313131") .. F(table_name) .. "]"
|
||||
.. "label[0,0;" .. C(mcl_colors.DARK_GRAY) .. F(table_name) .. "]"
|
||||
.. mcl_formspec.get_itemslot_bg(0.2, 2.4, 1, 1)
|
||||
.. "list[current_player;enchanting_item;0.2,2.4;1,1]"
|
||||
.. mcl_formspec.get_itemslot_bg(1.1, 2.4, 1, 1)
|
||||
.. "image[1.1,2.4;1,1;mcl_enchanting_lapis_background.png]"
|
||||
.. "list[current_player;enchanting_lapis;1.1,2.4;1,1]"
|
||||
.. "label[0,4;" .. C("#313131") .. F(S("Inventory")).."]"
|
||||
.. "label[0,4;" .. C(mcl_colors.DARK_GRAY) .. F(S("Inventory")).."]"
|
||||
.. mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3)
|
||||
.. mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1)
|
||||
.. "list[current_player;main;0,4.5;9,3;9]"
|
||||
|
@ -501,11 +501,11 @@ function mcl_enchanting.show_enchanting_formspec(player)
|
|||
local hover_ending = (can_enchant and "_hovered" or "_off")
|
||||
formspec = formspec
|
||||
.. "container[3.2," .. y .. "]"
|
||||
.. (slot and "tooltip[button_" .. i .. ";" .. C("#818181") .. F(slot.description) .. " " .. C("#FFFFFF") .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and "#818181" or "#FC5454") .. F(S("@1 Lapis Lazuli", i)) .. "\n" .. C("#818181") .. F(S("@1 Enchantment Levels", i)) or C("#FC5454") .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "")
|
||||
.. (slot and "tooltip[button_" .. i .. ";" .. C(mcl_colors.GRAY) .. F(slot.description) .. " " .. C(mcl_colors.WHITE) .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and mcl_colors.GRAY or mcl_colors.RED) .. F(S("@1 Lapis Lazuli", i)) .. "\n" .. C(mcl_colors.GRAY) .. F(S("@1 Enchantment Levels", i)) or C(mcl_colors.RED) .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "")
|
||||
.. "style[button_" .. i .. ";bgimg=mcl_enchanting_button" .. ending .. ".png;bgimg_hovered=mcl_enchanting_button" .. hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]"
|
||||
.. "button[0,0;7.5,1.3;button_" .. i .. ";]"
|
||||
.. (slot and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "")
|
||||
.. (slot and "label[7.2,1.1;" .. C(can_enchant and "#80FF20" or "#407F10") .. slot.level_requirement .. "]" or "")
|
||||
.. (slot and "label[7.2,1.1;" .. C(can_enchant and mcl_colors.GREEN or mcl_colors.DARK_GREEN) .. slot.level_requirement .. "]" or "")
|
||||
.. (slot and slot.glyphs or "")
|
||||
.. "container_end[]"
|
||||
y = y + 1.35
|
||||
|
@ -582,7 +582,12 @@ function mcl_enchanting.allow_inventory_action(player, action, inventory, invent
|
|||
local listname = inventory_info.to_list
|
||||
local stack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index)
|
||||
if stack:get_name() == "mcl_dye:blue" and listname ~= "enchanting_item" then
|
||||
return math.min(inventory:get_stack("enchanting_lapis", 1):get_free_space(), stack:get_count())
|
||||
local count = stack:get_count()
|
||||
local old_stack = inventory:get_stack("enchanting_lapis", 1)
|
||||
if old_stack:get_name() ~= "" then
|
||||
count = math.min(count, old_stack:get_free_space())
|
||||
end
|
||||
return count
|
||||
elseif inventory:get_stack("enchanting_item", 1):get_count() == 0 and listname ~= "enchanting_lapis" then
|
||||
return 1
|
||||
else
|
||||
|
|
|
@ -45,6 +45,10 @@ end
|
|||
-- To make it more efficient it will first check a hash value to determine if
|
||||
-- the tool needs to be updated.
|
||||
function mcl_enchanting.update_groupcaps(itemstack)
|
||||
if not itemstack:get_meta():get("tool_capabilities") then
|
||||
return
|
||||
end
|
||||
|
||||
local name = itemstack:get_name()
|
||||
local level = mcl_enchanting.get_enchantment(itemstack, "efficiency")
|
||||
local groupcaps = get_efficiency_groupcaps(name, level)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name = mcl_enchanting
|
||||
description = Enchanting for MineClone2
|
||||
depends = tt, walkover, mcl_sounds
|
||||
depends = tt, walkover, mcl_sounds, mcl_colors
|
||||
optional_depends = screwdriver
|
||||
author = Fleckenstein
|
||||
|
|
|
@ -29,7 +29,7 @@ minetest.register_entity("mcl_end:ender_eye", {
|
|||
if self._age >= 3 then
|
||||
-- End of life
|
||||
local r = math.random(1,5)
|
||||
if r == 1 or minetest.is_creative_enabled("") then
|
||||
if r == 1 then
|
||||
-- 20% chance to get destroyed completely.
|
||||
-- 100% if in Creative Mode
|
||||
self.object:remove()
|
||||
|
|
|
@ -78,6 +78,9 @@ minetest.register_tool("mcl_farming:hoe_wood", {
|
|||
},
|
||||
_repair_material = "group:wood",
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
hoey = { speed = 2, level = 1, uses = 60 }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
|
@ -118,6 +121,9 @@ minetest.register_tool("mcl_farming:hoe_stone", {
|
|||
},
|
||||
_repair_material = "mcl_core:cobble",
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
hoey = { speed = 4, level = 3, uses = 132 }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
|
@ -154,6 +160,9 @@ minetest.register_tool("mcl_farming:hoe_iron", {
|
|||
},
|
||||
_repair_material = "mcl_core:iron_ingot",
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
hoey = { speed = 6, level = 4, uses = 251 }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
|
@ -196,6 +205,9 @@ minetest.register_tool("mcl_farming:hoe_gold", {
|
|||
},
|
||||
_repair_material = "mcl_core:gold_ingot",
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
hoey = { speed = 12, level = 2, uses = 33 }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
|
@ -240,6 +252,9 @@ minetest.register_tool("mcl_farming:hoe_diamond", {
|
|||
},
|
||||
_repair_material = "mcl_core:diamond",
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
hoey = { speed = 8, level = 5, uses = 1562 }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
name = mcl_farming
|
||||
depends = mcl_core, mcl_sounds, mcl_wool, mcl_torches, mcl_weather, mobs_mc
|
||||
depends = mcl_core, mcl_sounds, mcl_wool, mcl_torches, mcl_weather, mobs_mc, mcl_colors
|
||||
optional_depends = mcl_armor, doc
|
||||
|
|
|
@ -118,7 +118,7 @@ minetest.register_craftitem("mcl_farming:potato_item_baked", {
|
|||
|
||||
minetest.register_craftitem("mcl_farming:potato_item_poison", {
|
||||
description = S("Poisonous Potato"),
|
||||
_tt_help = minetest.colorize("#FFFF00", S("60% chance of poisoning")),
|
||||
_tt_help = minetest.colorize(mcl_colors.YELLOW, S("60% chance of poisoning")),
|
||||
_doc_items_longdesc = S("This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly."),
|
||||
stack_max = 64,
|
||||
inventory_image = "farming_potato_poison.png",
|
||||
|
|
|
@ -146,7 +146,7 @@ minetest.register_node("mcl_farming:hay_block", {
|
|||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
on_place = mcl_util.rotate_axis,
|
||||
groups = {handy=1, flammable=2, fire_encouragement=60, fire_flammability=20, building_block=1, fall_damage_add_percent=-80},
|
||||
groups = {handy=1, hoey=1, flammable=2, fire_encouragement=60, fire_flammability=20, building_block=1, fall_damage_add_percent=-80},
|
||||
sounds = mcl_sounds.node_sound_leaves_defaults(),
|
||||
on_rotate = on_rotate,
|
||||
_mcl_blast_resistance = 0.5,
|
||||
|
|
|
@ -173,7 +173,7 @@ local fish = function(itemstack, player, pointed_thing)
|
|||
if noent == true then
|
||||
local playerpos = player:get_pos()
|
||||
local dir = player:get_look_dir()
|
||||
local obj = mcl_throwing.throw("mcl_throwing:flying_bobber", {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, 15, player:get_player_name())
|
||||
local obj = mcl_throwing.throw("mcl_fishing:flying_bobber", {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, 15, player:get_player_name())
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -295,6 +295,52 @@ bobber_ENTITY.on_step = bobber_on_step
|
|||
|
||||
minetest.register_entity("mcl_fishing:bobber_entity", bobber_ENTITY)
|
||||
|
||||
local flying_bobber_ENTITY={
|
||||
physical = false,
|
||||
timer=0,
|
||||
textures = {"mcl_fishing_bobber.png"}, --FIXME: Replace with correct texture.
|
||||
visual_size = {x=0.5, y=0.5},
|
||||
collisionbox = {0,0,0,0,0,0},
|
||||
pointable = false,
|
||||
|
||||
get_staticdata = get_staticdata,
|
||||
on_activate = on_activate,
|
||||
|
||||
_lastpos={},
|
||||
_thrower = nil,
|
||||
objtype="fishing",
|
||||
}
|
||||
|
||||
-- Movement function of flying bobber
|
||||
local flying_bobber_on_step = function(self, dtime)
|
||||
self.timer=self.timer+dtime
|
||||
local pos = self.object:get_pos()
|
||||
local node = minetest.get_node(pos)
|
||||
local def = minetest.registered_nodes[node.name]
|
||||
--local player = minetest.get_player_by_name(self._thrower)
|
||||
|
||||
-- Destroy when hitting a solid node
|
||||
if self._lastpos.x~=nil then
|
||||
if (def and (def.walkable or def.liquidtype == "flowing" or def.liquidtype == "source")) or not def then
|
||||
local make_child= function(object)
|
||||
local ent = object:get_luaentity()
|
||||
ent.player = self._thrower
|
||||
ent.child = true
|
||||
end
|
||||
make_child(minetest.add_entity(self._lastpos, "mcl_fishing:bobber_entity"))
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
end
|
||||
self._lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node
|
||||
end
|
||||
|
||||
flying_bobber_ENTITY.on_step = flying_bobber_on_step
|
||||
|
||||
minetest.register_entity("mcl_fishing:flying_bobber_entity", flying_bobber_ENTITY)
|
||||
|
||||
mcl_throwing.register_throwable_object("mcl_fishing:flying_bobber", "mcl_fishing:flying_bobber_entity", 5)
|
||||
|
||||
-- If player leaves area, remove bobber.
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
local objs = minetest.get_objects_inside_radius(player:get_pos(), 250)
|
||||
|
@ -449,7 +495,7 @@ minetest.register_craftitem("mcl_fishing:clownfish_raw", {
|
|||
|
||||
minetest.register_craftitem("mcl_fishing:pufferfish_raw", {
|
||||
description = S("Pufferfish"),
|
||||
_tt_help = minetest.colorize("#FFFF00", S("Very poisonous")),
|
||||
_tt_help = minetest.colorize(mcl_colors.YELLOW, S("Very poisonous")),
|
||||
_doc_items_longdesc = S("Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger)."),
|
||||
inventory_image = "mcl_fishing_pufferfish_raw.png",
|
||||
on_place = minetest.item_eat(1),
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
name = mcl_fishing
|
||||
description = Adds fish and fishing poles to go fishing.
|
||||
depends = mcl_core, mcl_sounds, mcl_loot, mcl_mobs, mcl_enchanting
|
||||
depends = mcl_core, mcl_sounds, mcl_loot, mcl_mobs, mcl_enchanting, mcl_throwing, mcl_colors
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue