mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2025-01-09 08:39:34 +01:00
0b27b6bec3
DO NOT USE IN PRODUCTION, DO NOT START OLD WORLDS WITHOUT A BACKUP These are the first steps of the new mob API. The game does actually start, but mobs do not work yet. You will also get some warnings about mob spawners, but don't worry about that. This is really just some 'first impression' of how the mob API is gonna look like. Some things are already complete, like the agression system. AI and attacking have not been worked on yet. mobs_mc and mcl_mobs have actually been merged into one piece but I will probably change that again in the future actually, and split the different mobs into different mods. There are also a few usefull things like the universal mount API and a more general purpose smoke API, but all of this is still far from complete. I'll put some work into the API this week but probably not next week, then I'll see but don't expect this to be done before 2022. I'll work on it, but I'll do it slowly and progressively to not get burned out again and to still have enough time to graduate from school in the meantime.
204 lines
6.6 KiB
Lua
204 lines
6.6 KiB
Lua
local S = minetest.get_translator("mesecons_pressureplates")
|
|
|
|
local PRESSURE_PLATE_INTERVAL = 0.04
|
|
|
|
local pp_box_off = {
|
|
type = "fixed",
|
|
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
|
}
|
|
|
|
local pp_box_on = {
|
|
type = "fixed",
|
|
fixed = { -7/16, -8/16, -7/16, 7/16, -7.5/16, 7/16 },
|
|
}
|
|
|
|
local function pp_on_timer(pos, elapsed)
|
|
local node = minetest.get_node(pos)
|
|
local basename = minetest.registered_nodes[node.name].pressureplate_basename
|
|
local activated_by = minetest.registered_nodes[node.name].pressureplate_activated_by
|
|
|
|
-- This is a workaround for a strange bug that occurs when the server is started
|
|
-- For some reason the first time on_timer is called, the pos is wrong
|
|
if not basename then return end
|
|
|
|
if activated_by == nil then
|
|
activated_by = { any = true }
|
|
end
|
|
|
|
local obj_does_activate = function(obj, activated_by)
|
|
if activated_by.any then
|
|
return true
|
|
elseif activated_by.mob and obj:get_luaentity() and obj:get_luaentity().is_mob == true then
|
|
return true
|
|
elseif activated_by.player and obj:is_player() then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
local objs = minetest.get_objects_inside_radius(pos, 1)
|
|
|
|
if node.name == basename .. "_on" then
|
|
local disable
|
|
if #objs == 0 then
|
|
disable = true
|
|
elseif not activated_by.any then
|
|
disable = true
|
|
for k, obj in pairs(objs) do
|
|
if obj_does_activate(obj, activated_by) then
|
|
disable = false
|
|
break
|
|
end
|
|
end
|
|
end
|
|
if disable then
|
|
minetest.set_node(pos, {name = basename .. "_off"})
|
|
mesecon.receptor_off(pos, mesecon.rules.pplate)
|
|
end
|
|
elseif node.name == basename .. "_off" then
|
|
for k, obj in pairs(objs) do
|
|
local objpos = obj:get_pos()
|
|
if obj_does_activate(obj, activated_by) then
|
|
if objpos.y > pos.y-1 and objpos.y < pos.y then
|
|
minetest.set_node(pos, {name = basename .. "_on"})
|
|
mesecon.receptor_on(pos, mesecon.rules.pplate)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
-- Register a Pressure Plate
|
|
-- basename: base name of the pressure plate
|
|
-- description: description displayed in the player's inventory
|
|
-- textures_off:textures of the pressure plate when inactive
|
|
-- textures_on: textures of the pressure plate when active
|
|
-- image_w: wield image of the pressure plate
|
|
-- image_i: inventory image of the pressure plate
|
|
-- recipe: crafting recipe of the pressure plate
|
|
-- sounds: sound table (like in minetest.register_node)
|
|
-- plusgroups: group memberships (attached_node=1 and not_in_creative_inventory=1 are already used)
|
|
-- activated_by: optinal table with elements denoting by which entities this pressure plate is triggered
|
|
-- Possible table fields:
|
|
-- * player=true: Player
|
|
-- * mob=true: Mob
|
|
-- By default, is triggered by all entities
|
|
-- longdesc: Customized long description for the in-game help (if omitted, a dummy text is used)
|
|
|
|
function mesecon.register_pressure_plate(basename, description, textures_off, textures_on, image_w, image_i, recipe, sounds, plusgroups, activated_by, longdesc)
|
|
local groups_off = table.copy(plusgroups)
|
|
groups_off.attached_node = 1
|
|
groups_off.dig_by_piston = 1
|
|
groups_off.pressure_plate = 1
|
|
local groups_on = table.copy(groups_off)
|
|
groups_on.not_in_creative_inventory = 1
|
|
groups_on.pressure_plate = 2
|
|
if not longdesc then
|
|
longdesc = S("A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.")
|
|
end
|
|
local tt = S("Provides redstone power when pushed")
|
|
if not activated_by then
|
|
tt = tt .. "\n" .. S("Pushable by players, mobs and objects")
|
|
elseif activated_by.mob and activated_by.player then
|
|
tt = tt .. "\n" .. S("Pushable by players and mobs")
|
|
elseif activated_by.mob then
|
|
tt = tt .. "\n" .. S("Pushable by mobs")
|
|
elseif activated_by.player then
|
|
tt = tt .. "\n" .. S("Pushable by players")
|
|
end
|
|
|
|
mesecon.register_node(basename, {
|
|
drawtype = "nodebox",
|
|
inventory_image = image_i,
|
|
wield_image = image_w,
|
|
paramtype = "light",
|
|
walkable = false,
|
|
description = description,
|
|
on_timer = pp_on_timer,
|
|
on_construct = function(pos)
|
|
minetest.get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
|
|
end,
|
|
sounds = sounds,
|
|
is_ground_content = false,
|
|
pressureplate_basename = basename,
|
|
pressureplate_activated_by = activated_by,
|
|
_mcl_blast_resistance = 0.5,
|
|
_mcl_hardness = 0.5,
|
|
},{
|
|
node_box = pp_box_off,
|
|
selection_box = pp_box_off,
|
|
groups = groups_off,
|
|
tiles = textures_off,
|
|
|
|
mesecons = {receptor = { state = mesecon.state.off, rules = mesecon.rules.pplate }},
|
|
_doc_items_longdesc = longdesc,
|
|
_tt_help = tt,
|
|
},{
|
|
node_box = pp_box_on,
|
|
selection_box = pp_box_on,
|
|
groups = groups_on,
|
|
tiles = textures_on,
|
|
description = "",
|
|
|
|
mesecons = {receptor = { state = mesecon.state.on, rules = mesecon.rules.pplate }},
|
|
_doc_items_create_entry = false,
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = basename .. "_off",
|
|
recipe = recipe,
|
|
})
|
|
|
|
if minetest.get_modpath("doc") then
|
|
doc.add_entry_alias("nodes", basename .. "_off", "nodes", basename .. "_on")
|
|
end
|
|
end
|
|
|
|
local woods = {
|
|
{ "wood", "mcl_core:wood", "default_wood.png", S("Oak Pressure Plate") },
|
|
{ "acaciawood", "mcl_core:acaciawood", "default_acacia_wood.png", S("Acacia Pressure Plate") },
|
|
{ "birchwood", "mcl_core:birchwood", "mcl_core_planks_birch.png", S("Birch Pressure Plate") },
|
|
{ "darkwood", "mcl_core:darkwood", "mcl_core_planks_big_oak.png", S("Dark Oak Pressure Plate" )},
|
|
{ "sprucewood", "mcl_core:sprucewood", "mcl_core_planks_spruce.png", S("Spruce Pressure Plate") },
|
|
{ "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Pressure Plate") },
|
|
}
|
|
|
|
for w=1, #woods do
|
|
mesecon.register_pressure_plate(
|
|
"mesecons_pressureplates:pressure_plate_"..woods[w][1],
|
|
woods[w][4],
|
|
{woods[w][3]},
|
|
{woods[w][3]},
|
|
woods[w][3],
|
|
nil,
|
|
{{woods[w][2], woods[w][2]}},
|
|
mcl_sounds.node_sound_wood_defaults(),
|
|
{axey=1, material_wood=1},
|
|
nil,
|
|
S("A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it."))
|
|
|
|
minetest.register_craft({
|
|
type = "fuel",
|
|
recipe = "mesecons_pressureplates:pressure_plate_"..woods[w][1].."_off",
|
|
burntime = 15
|
|
})
|
|
|
|
end
|
|
|
|
mesecon.register_pressure_plate(
|
|
"mesecons_pressureplates:pressure_plate_stone",
|
|
S("Stone Pressure Plate"),
|
|
{"default_stone.png"},
|
|
{"default_stone.png"},
|
|
"default_stone.png",
|
|
nil,
|
|
{{"mcl_core:stone", "mcl_core:stone"}},
|
|
mcl_sounds.node_sound_stone_defaults(),
|
|
{pickaxey=1, material_stone=1},
|
|
{ player = true, mob = true },
|
|
S("A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else."))
|
|
|
|
|