Find and add a lucky block mod

master
Solebull 2018-12-17 16:35:54 +01:00
parent 263bec00e4
commit eb87827022
26 changed files with 2278 additions and 1 deletions

View File

@ -40,14 +40,16 @@ wool_cyan.png wool_magenta.png wool_white.png
wool_dark_green.png
**** Improve Gameplay
CLOCK: [2018-12-17 lun. 16:28]--[2018-12-17 lun. 16:35] => 0:07
CLOCK: [2018-09-06 jeu. 16:21]--[2018-09-06 jeu. 16:32] => 0:11
CLOCK: [2018-09-05 mer. 16:08]--[2018-09-05 mer. 16:16] => 0:08
- [X] Try to grow some animals
- [X] Add a bed mod https://github.com/minetest/minetest_game/tree/master/mods/beds
It is already present : seulement red, red, white ?
Test it in creative. It works. So only red beds :(
- [X] Try to find a lucky block mod
from https://notabug.org/TenPlus1/lucky_block.git
- [ ] Find more and more texture packs
- [ ] Try to find a lucky block mod
- [ ] Placing a block near a cactus should cut it
- [ ] The actual death message about Serena is wrong (just a random one)
- [ ] Try a faction mod
@ -90,6 +92,7 @@ https://gist.github.com/iqualfragile/bc0864e1cc9830d40e0a
- [X] mescons mod present ? OUI
with exaltion
- Silver pickaxe mine pas assez vite
- [ ] Add a listplayers command to list connected players
- [ ] Bigger player inventory
**** TODO Should add a LICENSE file
- [ ] What is the licensing terms of Minecraft ?

1
TODO
View File

@ -11,4 +11,5 @@ minetest-solebull - ??? - A PVP/faction game for minetest based on Cobalt.
* v0.0.1-3 (17 Dec. 2018 - ???)
- (2) Find and add a lucky block mod
- Add luacmd mod

View File

@ -0,0 +1,28 @@
Lucky Block mod [lucky_block]
This mod adds a new and exciting block to the game which when broken can give
the player something good, surprising, bad, hurtful or just simply a troll.
Lucky Blocks can be crafted with 1 chest surrounded by gold ingots.
The api.txt document shows how to add your own blocks to the list by using
one of the 9 commands included and the blocks.lua file gives you many examples
by using some of the popular mods available.
https://forum.minetest.net/viewtopic.php?f=9&t=13284
Changelog:
- 0.1 - Initial release
- 0.2 - New api commands added thanks to blert2112
- 0.3 - New blocks added, also error checking, new options and schematic rehaul
- 0.4 - Added ability to add custom functions within lucky blocks
- 0.5 - Explosions now have radius and fire setting, also added new blocks
- 0.6 - Use TNT mod for explosions and if not active do entity damage only
- 0.7 - Added new floor feature and moreblocks support
- 0.8 - Added wishing well with random block drops
- 0.9 - Tweak item drops, add replacements to schematics, tidy wishing well code
- 1.0 - Added ability for custom lucky blocks to use their own block list
- 1.1 - Spawning mobs can now select randomly from a table or single string
Lucky Blocks: 259 (depending on mods enabled)

353
mods/lucky_block/api.txt Normal file
View File

@ -0,0 +1,353 @@
Lucky Block API
===============
This guide will show you how to add schematic files and lucky blocks from
within your own mods. Please make sure that lucky_block appears in the
depends.txt file of your mod so everything work properly.
Function Usage
==============
Purge Block List
----------------
lucky_block:purge_block_list()
This command is used to clear all of the blocks in the lucky block list so that
you can add your own.
Add Lucky Blocks to list
------------------------
lucky_block:add_blocks({ block definitions here })
This command is used to add new blocks to the lucky block list.
e.g.
lucky_block:add_blocks({
{"nod", "default:dirt", 0},
{"dro", {"default:dirt"}, 5},
})
Purge Chest Items
-----------------
lucky_block:purge_chest_items()
This command is used to purge all items in the default chest list so that you
can add your own.
Add Items to Default Chest
--------------------------
lucky_block:add_chest_items({ add new default chest items here })
This command lets you add new items to the default chest when it appears
inside a lucky block.
e.g.
lucky_block:add_chest_items({
{name = "default:apple", max = 3},
{name = "default:steel_ingot", max = 2},
{name = "default:pick_steel", max = 1}
})
Add Schematics to List
----------------------
lucky_block:add_schematics({ add new schematic definitions here })
This command lets you add schematic files and arrays to the list so they can
be added to the lucky block list.
e.g. check for Ethereal mod then get the path and add two of the tree's to the
schematic list and finally to the lucky block list:
if minetest.get_modpath("ethereal") then
local path = minetest.get_modpath("ethereal") .. "/schematics/"
lucky_block:add_schematics({
-- name on list, schematic, offset placement
{"appletree", ethereal.appletree, {x = 1, y = 0, z = 1}},
{"bananatree", ethereal.bananatree, {x = 3, y = 0, z = 3}},
}
lucky_block:add_blocks({
{"sch", "appletree", 0, false},
{"sch", "bananatree", 0, false},
})
end
Open Lucky Block
----------------
lucky_block:open(pos, digger, blocks_list)
This is the function called when the default lucky block has been dug, it will
use the default blocks list or use a custom one when supplied so that modders
can add their own lucky block sets.
e.g.
local my_blocks = {
{"nod", "default:wood"},
{"dro", {"default:tree", "default:jungletree"}, 5},
{"exp"},
}
minetest.register_node('mymod:my_lucky_block', {
description = "My Lucky Block",
tiles = {"mymod_lucky_block.png"},
paramtype = "light",
groups = {oddly_breakable_by_hand = 3},
drop = {},
sounds = default.node_sound_wood_defaults(),
on_dig = function(pos, node, digger)
minetest.remove_node(pos) -- remove lucky block
lucky_block:open(pos, digger, my_blocks) -- use custom blocks list
end,
})
Lucky Block Commands
====================
Using the lucky_block:add_blocks() command gives you access to many features
from within this mod, these are listed below using this general format:
lucky_block:add_blocks({
{"command", command options},
..etc
})
Place Node
----------
This command will place a node in place of the lucky block or at the players
standing position.
{"nod", "node name", position, chest items}
e.g.
Place a dirt block where lucky block was
{"nod", "default:dirt", 0}
Place a chest containing random items from default chest items list
{"nod", "default:chest", 0}
Place chest as above only add up to 5x roses as well
{"nod", "default:chest", 0, { {name = "flowers:rose, max = 4} }}
Place fire at player position
{"nod", "fire:basic_flame", 1}
Drop Item(s)
------------
This command will throw a single or multiple items out of a lucky block,
random colours can be used also.
{"dro", {"item names"}, how many to drop, use random colours}
e.g.
Drop 5x torches as itemstack
{"dro", {"default:torch"}, 5}
Drop 10x randomly coloured wool (colour name added to end of item string)
{"dro", {"wool:"}, 10, true}
Drop 1x random tool from list
{"dro", {"default:pick_mese", "default:shovel_steel", "default:axe_diamond"}, 1}
Place Schematic
---------------
This command lets you place a pre-added schematic file or definition in place
of the lucky block or at the player position.
{"sch", "schematic name", position, force placement, replacements}
e.g.
Place lucky platform at player position and force placement
{"sch", "platform", 1, true}
Place apple tree where lucky block use to be
{"sch", "appletree", 0, false}
Place apple tree where lucky block use to be and change wood into stone
{"sch", "appletree", 0, false, {{"default:wood", "default:stone"}} }
Spawn Entity or Mob
-------------------
This command allows you to place a monster, animal or other entity.
{"spw", {"entity name"}, how many to spawn, tamed, owned, range, nametag}
e.g.
Spawn 2x Dirt or Stone Monsters over a radius of 10 blocks
{"spw", {"mobs:dirt_monster", "mobs:stone_monster"}, 2, nil, nil, 10}
Spawn 5x randomly coloured sheep (random colour only works with Mobs Redo sheep)
{"spw", "mobs:sheep", 5}
Spawn a single NPC who is tamed and owned by player and called "Bob"
{"spw", "mobs:npc", 1, true, true, 1, "Bob"}
Falling Blocks
--------------
This command allows for a tower of blocks or blocks falling within a set area.
{"fal", {"node list"}, position, spread, range}
e.g.
Drop 2x sand and 1x gold block spread over a range of 5 blocks
{"fal", {"default:sand", "default:sand", "default:goldblock"}, 0, true, 5}
Drop 3x obsidian onto player as a tower
{"fal", {"default:obsidian", "default:obsidian", "default:obsidian"}, 1}
Troll Block
-----------
This command is similar to the place node command only it allows for a sound to
be played on placement, then after two seconds the block will disappear or
can explode causing damage to nearby players.
{"tro", "node name", "sound", explode}
e.g.
Add diamond block then after 2 seconds remove with explosion
{"tro", "default:diamondblock", nil, true}
Add gold block with wood sound, then after 2 seconds remove with pop
{"tro", "default:goldblock", "default_wood_footstep", nil}
Random Teleport
---------------
This command will teleport the player opening the lucky block a random number
of blocks away using a preset range.
{"tel", horizontal range, vertical range}
e.g.
Teleport player to random position 10 blocks left/right and 5 blocks up/under
{"tel", 10, 5}
Explosion
---------
Now we start adding the bad lucky blocks that cause damage to the player by
adding explosions.
{"exp", radius}
e.g.
Cause explosion with damage radius of 4.
{"exp", 4}
Lightning Strike
----------------
This is one of my favourite commands, lightning strikes the player and hurts
everyone else nearby, can also place fire at strike position.
{"lig", "fire node"}
e.g.
Strike player and place temporary fire
{"lig", "fire:basic_flame"}
Strike player and place permanent flame
{"lig", "fire:permanent_flame"}
Floor Placement
---------------
This feature places random blocks from the list provided to make a floor under
the lucky block with a pause after each block.
{"flo", width, {node_list}, offset},
e.g.
Place a three wide obsidian and gold block floor with offset of 1 to centre on
lucky block
{"flo", 3, {"default:goldblock", "default:obsidian"}, 1}
Have a woolen floor at 5 width with offset of 2 to keep it centred
{"flo", 5, {"wool:red", "wool:blue", "wool:white", "wool:orange"}, 2}
Custom Function
---------------
This allows mod makers to use there own functions when opening lucky blocks and
passes the block position and player opening it.
{"cus", myfunction}
e.g.
Punch player and deal 5 damage points (function first then line to add l.block)
local function punchy(pos, player)
player:punch(player, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = 5}
}, nil)
end
{"cus", punchy}
Final Words
===========
I hope this guide helps you add lucky blocks from within your own mods and for
more examples please check out the blocks.lua and schems.lua files.

708
mods/lucky_block/blocks.lua Normal file
View File

@ -0,0 +1,708 @@
-- Load support for intllib.
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP .. "/intllib.lua")
-- Default tree schematics
local dpath = minetest.get_modpath("default") .. "/schematics/"
lucky_block:add_schematics({
{"appletree", dpath .. "apple_tree_from_sapling.mts", {x = 2, y = 1, z = 2}},
{"jungletree", dpath .. "jungle_tree_from_sapling.mts", {x = 2, y = 1, z = 2}},
{"defpinetree", dpath .. "pine_tree_from_sapling.mts", {x = 2, y = 1, z = 2}},
{"acaciatree", dpath .. "acacia_tree_from_sapling.mts", {x = 4, y = 1, z = 4}},
{"aspentree", dpath .. "aspen_tree_from_sapling.mts", {x = 2, y = 1, z = 2}},
{"corals", dpath .. "corals.mts", {x = 2, y = 1, z = 2}},
{"largecactus", dpath .. "large_cactus.mts", {x = 2, y = 0, z = 0}},
{"defaultbush", dpath .. "bush.mts", {x = 1, y = 1, z = 1}},
{"acaciabush", dpath .. "acacia_bush.mts", {x = 1, y = 1, z = 1}},
})
-- Default blocks
lucky_block:add_blocks({
{"lig"},
{"fal", {"default:wood", "default:gravel", "default:sand",
"default:desert_sand", "default:stone", "default:dirt",
"default:goldblock"}, 0},
{"sch", "watertrap", 1, true},
{"tel"},
{"dro", {"default:apple"}, 10},
{"sch", "appletree", 0, false},
{"dro", {"default:snow"}, 10},
{"nod", "default:chest", 0, {
{name = "bucket:bucket_water", max = 1},
{name = "default:wood", max = 3},
{name = "default:pick_diamond", max = 1},
{name = "default:coal_lump", max = 3} } },
{"sch", "sandtrap", 1, true},
{"sch", "defpinetree", 0, false},
{"sch", "lavatrap", 1, true},
{"dro", {"default:mese_crystal_fragment"}, 15},
{"dro", {"default:mese_crystal"}, 10},
{"dro", {"default:mese"}, 1},
{"exp", 2},
{"sch", "acaciabush", 0, false},
{"nod", "default:diamondblock", 0},
{"nod", "default:steelblock", 0},
{"nod", "default:dirt", 0},
{"nod", "default:chest", 0, {
{name = "default:dirt", max = 15},
{name = "default:dirt_with_dry_grass", max = 15},
{name = "default:dirt_with_rainforest_litter", max = 15},
{name = "default:dirt_with_grass", max = 15},
{name = "default:dirt_with_snow", max = 15},
}},
{"dro", {"dye:"}, 10, true},
{"dro", {"default:sword_steel"}},
{"sch", "jungletree", 0, false},
{"sch", "sandtrap", 1, true, {{"default:sand", "default:silver_sand"}} },
{"dro", {"default:pick_steel"}},
{"dro", {"default:shovel_steel"}},
{"exp"},
{"dro", {"default:coal_lump"}, 3},
{"sch", "defaultbush", 0, false},
{"tro", "default:mese", "tnt_blast", true},
{"sch", "acaciatree", 0, false},
{"dro", {"default:axe_steel"}},
{"dro", {"default:sword_bronze"}},
{"exp", 3},
{"nod", "default:chest", 0, {
{name = "default:acacia_sapling", max = 10},
{name = "default:aspen_sapling", max = 10},
{name = "default:pine_sapling", max = 10},
{name = "default:sapling", max = 10},
{name = "default:junglesapling", max = 10},
{name = "default:acacia_bush_sapling", max = 5},
{name = "default:bush_sapling", max = 5},
}},
{"sch", "platform", 1, true},
{"nod", "default:wood", 0},
{"dro", {"default:pick_bronze"}},
{"sch", "aspentree", 0, false},
{"dro", {"default:shovel_bronze"}},
{"nod", "default:gravel", 0},
{"sch", "sandtrap", 1, true, {{"default:sand", "default:gravel"}} },
{"sch", "largecactus", 0, false},
{"dro", {"default:axe_bronze"}},
{"dro", {"default:bookshelf", "default:book", "default:paper"}, 5},
{"dro", {"default:fence_wood"}, 10},
{"dro", {"default:fence_acacia_wood"}, 10},
{"dro", {"default:fence_aspen_wood"}, 10},
{"dro", {"default:fence_junglewood"}, 10},
{"dro", {"default:fence_pine_wood"}, 10},
{"sch", "obsidiantrap", 1, true},
{"sch", "sandtrap", 1, true, {{"default:sand", "default:desert_sand"}} },
{"nod", "default:chest", 0, {
{name = "default:acacia_wood", max = 10},
{name = "default:aspen_wood", max = 10},
{name = "default:pine_wood", max = 10},
{name = "default:wood", max = 10},
{name = "default:junglewood", max = 10},
}},
{"nod", "default:chest", 0, {
{name = "default:acacia_tree", max = 10},
{name = "default:aspen_tree", max = 10},
{name = "default:pine_tree", max = 10},
{name = "default:tree", max = 10},
{name = "default:jungletree", max = 10},
}},
{"dro", {"default:coral_brown"}, 5},
{"dro", {"default:coral_orange"}, 5},
{"dro", {"default:coral_skeleton"}, 5},
{"sch", "corals", 0, true},
{"dro", {"default:mese_post_light"}, 5},
{"dro", {"default:fence_wood"}, 5},
{"nod", "default:mese_post_light"},
{"dro", {"default:silver_sand"}, 20},
{"dro", {"default:sand"}, 20},
{"dro", {"default:desert_sand"}, 20},
{"dro", {"default:gravel"}, 15},
{"nod", "default:chest", 0, {
{name = "default:silver_sand", max = 20},
{name = "default:silver_sandstone", max = 20},
{name = "default:desert_sand", max = 20},
{name = "default:silver_sandstone", max = 20},
{name = "default:sand", max = 20},
{name = "default:sandstone", max = 20},
{name = "default:gravel", max = 20},
}},
{"dro", {"default:obsidian"}, 14},
})
local green = minetest.get_color_escape_sequence("#1eff00")
-- custom function (punches player with 5 damage)
local function punchy(pos, player)
player:punch(player, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = 5}
}, nil)
minetest.sound_play("player_damage", {pos = pos, gain = 1.0})
minetest.chat_send_player(player:get_player_name(),
green .. S("Stop hitting yourself!"))
end
-- custom function (pint sized player) and potion with recipe
local function pint(pos, player)
player:set_properties({visual_size = {x = 0.5, y = 0.5}})
minetest.chat_send_player(player:get_player_name(),
green .. S("Pint Sized Player!"))
minetest.sound_play("default_place_node", {pos = pos, gain = 1.0})
minetest.after (180, function(player, pos) -- 3 minutes
if player and player:is_player() then
player:set_properties({visual_size = {x = 1.0, y = 1.0}})
minetest.sound_play("default_place_node", {pos = pos, gain = 1.0})
end
end, player)
end
minetest.register_craftitem("lucky_block:pint_sized_potion", {
description = S("Pint Sized Potion (DRINK ME)"),
inventory_image = "lucky_pint_sized_potion.png",
on_use = function(itemstack, user, pointed_thing)
itemstack:take_item()
local pos = user:get_pos()
local inv = user:get_inventory()
local item = "vessels:glass_bottle"
if inv:room_for_item("main", {name = item}) then
inv:add_item("main", item)
else
minetest.add_item(pos, {name = item})
end
pint(pos, user)
return itemstack
end,
})
minetest.register_craft({
output = "lucky_block:pint_sized_potion",
recipe = {
{"default:bush_sapling", "flowers:tulip", "default:acacia_bush_sapling"},
{"dye:blue", "default:apple", "dye:cyan"},
{"", "vessels:glass_bottle", ""},
}
})
-- custom function (drop player inventory and replace with dry shrubs)
local function bushy(pos, player)
local player_inv = player:get_inventory()
pos = player:get_pos() or pos
for i = 1, player_inv:get_size("main") do
local obj = minetest.add_item(pos, player_inv:get_stack("main", i))
if obj then
obj:setvelocity({
x = math.random(-10, 10) / 9,
y = 5,
z = math.random(-10, 10) / 9,
})
end
player_inv:set_stack("main", i, "default:dry_shrub")
end
minetest.chat_send_player(player:get_player_name(),
green .. S("Dry shrub takeover!"))
end
lucky_block:add_blocks({
{"cus", pint},
{"cus", bushy},
{"cus", punchy},
{"dro", {"lucky_block:pint_sized_potion"}, 1},
})
-- wool mod
if minetest.get_modpath("wool") then
lucky_block:add_blocks({
{"sch", "sandtrap", 1, true, {{"default:sand", "wool:red"}} },
{"dro", {"wool:"}, 10, true},
{"sch", "sandtrap", 1, true, {{"default:sand", "wool:green"}} },
{"dro", {"wool:white"}, 10},
})
end
-- extra doors mod
if minetest.get_modpath("extra_doors") then
lucky_block:add_blocks({
{"dro", {"default:steel_rod"}, 10},
{"dro", {"extra_doors:door_woodpanel1"}, 1},
{"dro", {"extra_doors:door_woodglass1"}, 1},
{"dro", {"extra_doors:door_woodglass2"}, 1},
{"dro", {"extra_doors:door_door_japanese"}, 1},
{"dro", {"extra_doors:door_door_french"}, 1},
{"dro", {"extra_doors:door_door_cottage1"}, 1},
{"dro", {"extra_doors:door_door_cottage2"}, 1},
{"dro", {"extra_doors:door_door_barn1"}, 1},
{"lig"},
{"dro", {"extra_doors:door_door_barn2"}, 1},
{"dro", {"extra_doors:door_door_castle1"}, 1},
{"dro", {"extra_doors:door_door_castle2"}, 1},
{"dro", {"extra_doors:door_door_mansion1"}, 1},
{"dro", {"extra_doors:door_door_mansion2"}, 1},
{"dro", {"extra_doors:door_door_dungeon1"}, 1},
{"dro", {"extra_doors:door_door_dungeon2"}, 1},
{"dro", {"extra_doors:door_door_steelpanel1"}, 1},
{"dro", {"extra_doors:door_door_steelglass1"}, 1},
{"dro", {"extra_doors:door_door_steelglass2"}, 1},
})
end
-- Flowers mod
if minetest.get_modpath("flowers") then
lucky_block:add_blocks({
{"nod", "flowers:rose", 0},
{"dro", {"flowers:mushroom_red"}, 5},
{"dro", {"flowers:mushroom_brown"}, 5},
{"dro", {"flowers:rose", "flowers:tulip", "flowers:dandelion_yellow",
"flowers:geranium", "flowers:viola", "flowers:dandelion_white"}, 12},
{"nod", "default:chest", 0, {
{name = "flowers:geranium", max = 15},
{name = "flowers:viola", max = 15},
{name = "flowers:dandelion_white", max = 15},
{name = "flowers:dandelion_yellow", max = 15},
{name = "flowers:tulip", max = 15},
{name = "flowers:rose", max = 15},
{name = "flowers:mushroom_brown", max = 10},
{name = "flowers:mushroom_red", max = 10},
{name = "flowers:waterlily", max = 10},
}},
})
end
-- Doors mod
if minetest.get_modpath("doors") then
lucky_block:add_blocks({
{"dro", {"doors:door_wood"}},
{"dro", {"doors:door_steel"}},
{"dro", {"doors:door_glass"}},
{"dro", {"doors:door_obsidian_glass"}},
{"dro", {"doors:trapdoor"}},
{"dro", {"doors:trapdoor_steel"}},
{"dro", {"doors:gate_acacia_wood_closed"}},
{"dro", {"doors:gate_aspen_wood_closed"}},
{"dro", {"doors:gate_wood_closed"}},
{"dro", {"doors:gate_pine_wood_closed"}},
{"dro", {"doors:gate_junglewood_closed"}},
})
end
-- Screwdriver mod
if minetest.get_modpath("screwdriver") then
if screwdriver and screwdriver.handler then
minetest.register_tool(":screwdriver:screwdriver_magenta", {
description = S("Super Mega Magenta Ultra Screwdriver 2500\n(left-click to rotate face, right-click to rotates axis)"),
inventory_image = "screwdriver.png^[colorize:#ff009970",
groups = {not_in_creative_inventory = 1},
on_use = function(itemstack, user, pointed_thing)
screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, 2500)
return itemstack
end,
on_place = function(itemstack, user, pointed_thing)
screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS, 2500)
return itemstack
end,
})
end
lucky_block:add_blocks({
{"dro", {"screwdriver:screwdriver"}},
{"dro", {"screwdriver:screwdriver_magenta"}},
})
end
-- Vessels mod
if minetest.get_modpath("vessels") then
lucky_block:add_blocks({
{"dro", {"vessels:shelf", "vessels:drinking_glass", "vessels:glass_bottle",
"vessels:steel_bottle", "vessels:glass_fragments"}, 5},
{"nod", "vessels:drinking_glass", 0},
{"nod", "vessels:glass_bottle", 0},
{"nod", "vessels:steel_bottle", 0},
})
end
-- Farming mod (default)
if minetest.get_modpath("farming") then
lucky_block:add_blocks({
{"dro", {"farming:bread"}, 5},
{"sch", "instafarm", 0, true},
{"nod", "default:water_source", 1},
{"nod", "farming:straw", 1},
{"dro", {"farming:straw"}, 8},
})
end
-- Home Decor mod
if minetest.get_modpath("homedecor") then
lucky_block:add_blocks({
{"nod", "homedecor:toilet", 0},
{"nod", "homedecor:table", 0},
{"nod", "homedecor:chair", 0},
{"nod", "homedecor:table_lamp_off", 0},
{"dro", {"homedecor:plastic_sheeting", "homedecor:plastic_base"}, 15},
{"dro", {"homedecor:roof_tile_terracotta"}, 20},
{"dro", {"homedecor:shutter_oak"}, 5},
{"dro", {"homedecor:shutter_black"}, 5},
{"dro", {"homedecor:shutter_dark_grey"}, 5},
{"dro", {"homedecor:shutter_grey"}, 5},
{"dro", {"homedecor:shutter_white"}, 5},
{"dro", {"homedecor:shutter_mahogany"}, 5},
{"dro", {"homedecor:shutter_yellow"}, 5},
{"dro", {"homedecor:shutter_forest_green"}, 5},
{"dro", {"homedecor:shutter_light_blue"}, 5},
{"dro", {"homedecor:shutter_violet"}, 5},
{"dro", {"homedecor:table_legs_wrought_iron", "homedecor:utility_table_legs"}, 5},
{"dro", {"homedecor:pole_wrought_iron"}, 10},
{"dro", {"homedecor:fence_picket_white"}, 20},
})
end
-- Boats mod
if minetest.get_modpath("boats") then
lucky_block:add_blocks({
{"dro", {"boats:boat"}},
})
end
-- Beds mod
if minetest.get_modpath("beds") then
lucky_block:add_blocks({
{"dro", {"beds:bed"}},
{"dro", {"beds:fancy_bed"}},
})
end
-- Walls mod
if minetest.get_modpath("walls") then
lucky_block:add_blocks({
{"dro", {"walls:cobble"}, 10},
{"dro", {"walls:mossycobble"}, 10},
{"dro", {"walls:desertcobble"}, 10},
})
end
-- Carts mod
if minetest.get_modpath("carts")
or minetest.get_modpath("boost_cart") then
lucky_block:add_blocks({
{"dro", {"carts:cart"}},
{"dro", {"default:rail"}, 10},
{"dro", {"carts:powerrail"}, 5},
})
end
-- 3D Armor mod
if minetest.get_modpath("3d_armor") then
lucky_block:add_blocks({
{"dro", {"3d_armor:boots_wood"}},
{"dro", {"3d_armor:leggings_wood"}},
{"dro", {"3d_armor:chestplate_wood"}},
{"dro", {"3d_armor:helmet_wood"}},
{"tel"},
{"dro", {"3d_armor:boots_steel"}},
{"dro", {"3d_armor:leggings_steel"}},
{"dro", {"3d_armor:chestplate_steel"}},
{"dro", {"3d_armor:helmet_steel"}},
{"dro", {"3d_armor:boots_gold"}},
{"dro", {"3d_armor:leggings_gold"}},
{"dro", {"3d_armor:chestplate_gold"}},
{"exp"},
{"dro", {"3d_armor:helmet_gold"}},
{"dro", {"3d_armor:boots_cactus"}},
{"dro", {"3d_armor:leggings_cactus"}},
{"dro", {"3d_armor:chestplate_cactus"}},
{"dro", {"3d_armor:helmet_cactus"}},
{"dro", {"3d_armor:boots_bronze"}},
{"dro", {"3d_armor:leggings_bronze"}},
{"dro", {"3d_armor:chestplate_bronze"}},
{"dro", {"3d_armor:helmet_bronze"}},
{"lig"},
})
end
-- 3D Armor's Shields mod
if minetest.get_modpath("shields") then
lucky_block:add_blocks({
{"dro", {"shields:shield_wood"}},
{"dro", {"shields:shield_steel"}},
{"dro", {"shields:shield_gold"}},
{"dro", {"shields:shield_cactus"}},
{"dro", {"shields:shield_bronze"}},
{"exp", 2},
})
end
-- Fire mod
if minetest.get_modpath("fire") then
lucky_block:add_blocks({
{"dro", {"fire:flint_and_steel"}},
{"dro", {"default:flint"}, 5},
{"nod", "fire:basic_flame", 1},
{"nod", "fire:permanent_flame", 1},
{"sch", "firetrap", 1, true},
})
end
-- Caverealms
if minetest.get_modpath("caverealms") then
lucky_block:add_blocks({
{"sch", "sandtrap", 1, true, {{"default:sand", "caverealms:coal_dust"}} },
{"sch", "obsidiantrap", 1, true, {{"default:obsidian", "caverealms:glow_obsidian_brick_2"}} },
{"flo", 5, {"caverealms:stone_with_moss"}, 2},
{"flo", 5, {"caverealms:stone_with_lichen"}, 2},
{"flo", 5, {"caverealms:stone_with_algae"}, 2},
})
end
-- TNT mod
if minetest.get_modpath("tnt") then
local p = "tnt:tnt_burning"
lucky_block:add_blocks({
{"dro", {"tnt:gunpowder"}, 5},
{"fal", {p, p, p, p, p}, 1, true, 4},
{"nod", "tnt:tnt_burning", 0},
})
end
-- More Ore's mod
if minetest.get_modpath("moreores") then
lucky_block:add_blocks({
{"nod", "moreores:tin_block", 0},
{"nod", "moreores:silver_block", 0},
{"fal", {"default:sand", "default:sand", "default:sand", "default:sand",
"default:sand", "default:sand", "moreores:mithril_block"}, 0},
{"dro", {"moreores:pick_silver"}},
{"dro", {"moreores:pick_mithril"}},
{"tro", "moreores:silver_block"},
{"dro", {"moreores:shovel_silver"}},
{"dro", {"moreores:shovel_mithril"}},
{"dro", {"moreores:axe_silver"}},
{"dro", {"moreores:axe_mithril"}},
{"tro", "moreores:mithril_block"},
{"dro", {"moreores:hoe_silver"}},
{"dro", {"moreores:hoe_mithril"}},
{"lig"},
{"nod", "default:chest", 0, {
{name = "moreores:silver_lump", max = 10},
{name = "moreores:mithril_lump", max = 10},
{name = "default:copper_lump", max = 10},
{name = "default:gold_lump", max = 10},
{name = "default:iron_lump", max = 10},
{name = "default:tin_lump", max = 10},
{name = "default:coal_lump", max = 10},
{name = "default:clay_lump", max = 10},
}},
})
if minetest.get_modpath("3d_armor") then
lucky_block:add_blocks({
{"dro", {"3d_armor:helmet_mithril"}},
{"dro", {"3d_armor:chestplate_mithril"}},
{"dro", {"3d_armor:leggings_mithril"}},
{"dro", {"3d_armor:boots_mithril"}},
})
end
if minetest.get_modpath("shields") then
lucky_block:add_blocks({
{"dro", {"shields:shield_mithril"}},
})
end
end -- END moreores
-- Moreblocks mod
if minetest.get_modpath("moreblocks") then
local p = "moreblocks:"
local lav = {name = "default:lava_source"}
local air = {name = "air"}
local trs = {name = p.."trap_stone"}
local trg = {name = p.."trap_glow_glass"}
local trapstone_trap = {
size = {x = 3, y = 6, z = 3},
data = {
lav, lav, lav, air, air, air, air, air, air,
air, air, air, air, air, air, trs, trs, trs,
lav, lav, lav, air, air, air, air, air, air,
air, air, air, air, trg, air, trs, air, trs,
lav, lav, lav, air, air, air, air, air, air,
air, air, air, air, air, air, trs, trs, trs,
},
}
lucky_block:add_schematics({
{"trapstonetrap", trapstone_trap, {x = 1, y = 6, z = 1}},
})
lucky_block:add_blocks({
{"dro", {p.."wood_tile"}, 10},
{"dro", {p.."wood_tile_center"}, 10},
{"dro", {p.."wood_tile_full"}, 10},
{"dro", {p.."wood_tile_offset"}, 10},
{"dro", {p.."circle_stone_bricks"}, 20},
{"dro", {p.."grey_bricks"}, 20},
{"dro", {p.."stone_tile"}, 10},
{"dro", {p.."split_stone_tile"}, 10},
{"dro", {p.."split_stone_tile_alt"}, 10},
{"flo", 5, {"moreblocks:stone_tile", "moreblocks:split_stone_tile"}, 2},
{"dro", {p.."tar", p.."cobble_compressed"}, 10},
{"dro", {p.."cactus_brick"}, 10},
{"dro", {p.."cactus_checker"}, 10},
{"nod", {p.."empty_bookshelf"}, 0},
{"dro", {p.."coal_stone"}, 10},
{"dro", {p.."coal_checker"}, 10},
{"dro", {p.."coal_stone_bricks"}, 10},
{"dro", {p.."coal_glass"}, 10},
{"exp", 3},
{"dro", {p.."iron_stone"}, 10},
{"dro", {p.."iron_checker"}, 10},
{"dro", {p.."iron_stone_bricks"}, 10},
{"dro", {p.."iron_glass"}, 10},
{"dro", {p.."trap_obsidian"}, 10},
{"dro", {p.."trap_sandstone"}, 10},
{"dro", {p.."trap_desert_stone"}, 10},
{"dro", {p.."trap_stone"}, 10},
{"dro", {p.."trap_glass"}, 10},
{"dro", {p.."trap_glow_glass"}, 10},
{"dro", {p.."trap_obsidian_glass"}, 10},
{"lig"},
{"sch", "trapstonetrap", 0, true},
{"dro", {p.."all_faces_tree"}, 10},
{"dro", {p.."all_faces_jungle_tree"}, 10},
{"dro", {p.."all_faces_pine_tree"}, 10},
{"dro", {p.."all_faces_acacia_tree"}, 10},
{"dro", {p.."all_faces_aspen_tree"}, 10},
{"flo", 3, {p.."all_faces_acacia_tree"}, 1},
{"dro", {p.."plankstone"}, 10},
{"fal", {p.."all_faces_tree", p.."all_faces_tree", p.."all_faces_tree", p.."all_faces_tree", p.."all_faces_tree"}, 0},
{"dro", {p.."glow_glass"}, 10},
{"dro", {p.."super_glow_glass"}, 10},
{"dro", {p.."clean_glass"}, 10},
{"nod", "default:chest", 0, {
{name = p.."rope", max = 10},
{name = p.."sweeper", max = 1},
{name = p.."circular_saw", max = 1},
{name = p.."grey_bricks", max = 10},
{name = p.."tar", max = 3}}},
{"flo", 3, {"moreblocks:copperpatina"}, 1},
})
end
-- Bags mod
if minetest.get_modpath("bags") then
minetest.register_craftitem(":bags:spar", {
description = "Spar Bag",
inventory_image = "bags_spar.png",
groups = {bagslots = 2, flammable = 2},
})
lucky_block:add_blocks({
{"dro", {"bags:spar"}},
{"dro", {"bags:small"}},
{"dro", {"bags:medium"}},
{"dro", {"bags:large"}},
{"dro", {"bags:trolley"}},
})
end
-- Additional Wishing Well Styles
lucky_block:add_blocks({
{"sch", "wishingwell", 0, true},
{"sch", "wishingwell", 0, true, {
{"default:stonebrick", "default:silver_sandstone_brick"},
{"stairs:slab_stonebrick", "stairs:slab_silver_sandstone_brick"},
{"default:fence_wood", "default:fence_aspen_wood"},
{"default:steelblock", "default:tinblock"},
} },
{"sch", "wishingwell", 0, true, {
{"default:stonebrick", "default:sandstonebrick"},
{"stairs:slab_stonebrick", "stairs:slab_sandstonebrick"},
{"default:fence_wood", "default:fence_junglewood"},
{"default:steelblock", "default:goldblock"},
} },
{"sch", "wishingwell", 0, true, {
{"default:stonebrick", "default:desert_stonebrick"},
{"stairs:slab_stonebrick", "stairs:slab_desert_stonebrick"},
{"default:fence_wood", "default:fence_acacia_wood"},
{"default:steelblock", "default:copperblock"},
} },
{"sch", "wishingwell", 0, true, {
{"default:stonebrick", "default:desert_sandstone_brick"},
{"stairs:slab_stonebrick", "stairs:slab_desert_sandstone_brick"},
{"default:fence_wood", "default:fence_pine_wood"},
{"default:steelblock", "default:bronzeblock"},
} },
})
-- Special items
minetest.register_node("lucky_block:void_mirror", {
description = S("Void Mirror (Place to see through solid walls during daytime)"),
drawtype = "normal",
tiles = {"default_obsidian_glass.png^[brighten"},
use_texture_alpha = true,
groups = {snappy = 3, not_in_creative_inventory = 1},
sounds = default.node_sound_glass_defaults(),
})
lucky_block:add_blocks({
{"dro", {"lucky_block:void_mirror"}},
})
-- Troll
local green = minetest.get_color_escape_sequence("#1eff00")
local function fake_diamonds(pos, player)
for n = 1, 25 do
minetest.add_particle({
time = 15,
pos = {
x = pos.x + math.random(-20, 20) / 10,
y = pos.y,
z = pos.z + math.random(-20, 20) / 10,
},
velocity = {x = 0, y = 2, z = 0},
acceleration = {x = 0, y = -10, z = 0},
expirationtime = 4,
maxsize = 4,
texture = "default_diamond.png",
glow = 2,
size = 5,
collisiondetection = true,
vertical = true,
})
end
minetest.chat_send_player(player:get_player_name(),
green .. S("Wow! So many faux diamonds!"))
end
lucky_block:add_blocks({
{"cus", fake_diamonds},
})

View File

@ -0,0 +1,4 @@
default
tnt?
screwdriver?
intllib?

View File

@ -0,0 +1 @@
Adds lucky blocks into the game which may give good, bad, hurtful items when open :)

740
mods/lucky_block/init.lua Normal file
View File

@ -0,0 +1,740 @@
lucky_block = {}
lucky_schems = {}
-- Load support for intllib.
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP .. "/intllib.lua")
-- default blocks
local lucky_list = {
{"nod", "lucky_block:super_lucky_block", 0},
}
-- ability to add new blocks to list
function lucky_block:add_blocks(list)
for s = 1, #list do
table.insert(lucky_list, list[s])
end
end
-- call to purge the block list
function lucky_block:purge_block_list()
lucky_list = {
{"nod", "lucky_block:super_lucky_block", 0}
}
end
-- add schematics to global list
function lucky_block:add_schematics(list)
for s = 1, #list do
table.insert(lucky_schems, list[s])
end
end
-- import schematics and default blocks
dofile(minetest.get_modpath("lucky_block") .. "/schems.lua")
dofile(minetest.get_modpath("lucky_block") .. "/blocks.lua")
-- for random colour selection
local all_colours = {
"grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta",
"orange", "violet", "brown", "pink", "dark_grey", "dark_green", "white"
}
-- default items in chests
local chest_stuff = {
{name = "default:apple", max = 3},
{name = "default:steel_ingot", max = 2},
{name = "default:gold_ingot", max = 2},
{name = "default:diamond", max = 1},
{name = "default:pick_steel", max = 1}
}
-- call to purge the chest items list
function lucky_block:purge_chest_items()
chest_stuff = {}
end
-- ability to add to chest items list
function lucky_block:add_chest_items(list)
for s = 1, #list do
table.insert(chest_stuff, list[s])
end
end
-- particle effects
local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow)
radius = radius or 2
gravity = gravity or -10
minetest.add_particlespawner({
amount = amount,
time = 0.25,
minpos = pos,
maxpos = pos,
minvel = {x = -radius, y = -radius, z = -radius},
maxvel = {x = radius, y = radius, z = radius},
minacc = {x = 0, y = gravity, z = 0},
maxacc = {x = 0, y = gravity, z = 0},
minexptime = 0.1,
maxexptime = 1,
minsize = min_size or 0.5,
maxsize = max_size or 1.0,
texture = texture,
glow = glow or 0,
})
end
-- temp entity for mob damage
minetest.register_entity("lucky_block:temp", {
physical = true,
collisionbox = {0, 0, 0, 0, 0, 0},
visual_size = {x = 0, y = 0},
visual = "sprite",
textures = {"tnt_smoke.png"},
on_step = function(self, dtime)
self.timer = (self.timer or 0) + dtime
if self.timer > 0.5 then
self.object:remove()
end
end
})
-- modified from TNT mod to deal entity damage only
local function entity_physics(pos, radius)
radius = radius * 2
local objs = minetest.get_objects_inside_radius(pos, radius)
local obj_pos, dist
-- add temp entity to cause damage
local tmp_ent = minetest.add_entity(pos, "lucky_block:temp")
for n = 1, #objs do
obj_pos = objs[n]:get_pos()
dist = vector.distance(pos, obj_pos)
if dist < 1 then dist = 1 end
local damage = math.floor((4 / dist) * radius)
local ent = objs[n]:get_luaentity()
if objs[n]:is_player() then
objs[n]:set_hp(objs[n]:get_hp() - damage)
else --if ent.health then
objs[n]:punch(tmp_ent, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = damage},
}, pos)
end
end
end
-- fill chest with random items from list
local function fill_chest(pos, items)
local stacks = items or {}
local inv = minetest.get_meta(pos):get_inventory()
inv:set_size("main", 8 * 4)
for i = 0, 2, 1 do
local stuff = chest_stuff[math.random(1, #chest_stuff)]
table.insert(stacks, {name = stuff.name, max = stuff.max})
end
for s = 1, #stacks do
if not inv:contains_item("main", stacks[s]) then
inv:set_stack("main", math.random(1, 32), {
name = stacks[s].name,
count = math.random(1, stacks[s].max)
})
end
end
end
-- explosion with protection check
local function explode(pos, radius, sound)
sound = sound or "tnt_explode"
if minetest.get_modpath("tnt") and tnt and tnt.boom
and not minetest.is_protected(pos, "") then
tnt.boom(pos, {
radius = radius,
damage_radius = radius,
sound = sound,
})
else
minetest.sound_play(sound, {pos = pos, gain = 1.0,
max_hear_distance = 32})
entity_physics(pos, radius)
effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0)
end
end
local lb_schematic = function(pos, digger, def)
if #lucky_schems == 0 then
print ("[lucky block] No schematics")
return
end
local schem = def[2]
local switch = def[3] or 0
local force = def[4]
local reps = def[5] or {}
if switch == 1 then
pos = vector.round(digger:get_pos())
end
for i = 1, #lucky_schems do
if schem == lucky_schems[i][1] then
local p1 = vector.subtract(pos, lucky_schems[i][3])
minetest.place_schematic(p1, lucky_schems[i][2], "", reps, force)
break
end
end
if switch == 1 then
digger:set_pos(pos, false)
end
end
local lb_node = function(pos, digger, def)
local nod = def[2]
local switch = def[3]
local items = def[4]
if switch == 1 then
pos = digger:get_pos()
end
if not minetest.registered_nodes[nod] then
nod = "default:goldblock"
end
effect(pos, 25, "tnt_smoke.png", 8, 8, 2, 1, 0)
minetest.set_node(pos, {name = nod})
if nod == "default:chest" then
fill_chest(pos, items)
end
end
local lb_spawn = function(pos, digger, def)
local pos2 = {}
local num = def[3] or 1
local tame = def[4]
local own = def[5]
local range = def[6] or 5
local name = def[7]
for i = 1, num do
pos2.x = pos.x + math.random(-range, range)
pos2.y = pos.y + 1
pos2.z = pos.z + math.random(-range, range)
local nod = minetest.get_node(pos2)
local nodef = minetest.registered_nodes[nod.name]
if nodef and nodef.walkable == false then
local entity
-- select between random or single entity
if type(def[2]) == "table" then
entity = def[2][math.random(1, #def[2])]
else
entity = def[2]
end
-- coloured sheep
if entity == "mobs:sheep" then
local colour = "_" .. all_colours[math.random(#all_colours)]
entity = "mobs:sheep" .. colour
end
-- has entity been registered?
if minetest.registered_entities[entity] then
local ent = minetest.add_entity(pos2, entity):get_luaentity()
if tame then
ent.tamed = true
end
if own then
ent.owner = digger:get_player_name()
end
if name then
ent.nametag = name
ent.object:set_properties({
nametag = name,
nametag_color = "#FFFF00"
})
end
else
print ("[lucky_block] " .. entity .. " could not be spawned")
end
end
end
end
local lb_explode = function(pos, def)
local rad = def[2] or 2
local snd = def[3] or "tnt_explode"
explode(pos, rad, snd)
end
local lb_teleport = function(pos, digger, def)
local xz_range = def[2] or 10
local y_range = def[3] or 5
pos.x = pos.x + math.random(-xz_range, xz_range)
pos.x = pos.y + math.random(-y_range, y_range)
pos.x = pos.z + math.random(-xz_range, xz_range)
effect(pos, 25, "tnt_smoke.png", 8, 8, 1, -10, 0)
digger:set_pos(pos, false)
effect(pos, 25, "tnt_smoke.png", 8, 8, 1, -10, 0)
minetest.chat_send_player(digger:get_player_name(),
minetest.get_color_escape_sequence("#1eff00") .. S("Random Teleport!"))
end
local lb_drop = function(pos, digger, def)
local num = def[3] or 1
local colours = def[4]
local items = #def[2]
-- drop multiple different items or colours
if items > 1 or colours then
for i = 1, num do
local item = def[2][math.random(1, items)]
if colours then
item = item .. all_colours[math.random(#all_colours)]
end
if not minetest.registered_items[item] then
item = "default:coal_lump"
end
local obj = minetest.add_item(pos, item)
if obj then
obj:set_velocity({
x = math.random(-10, 10) / 9,
y = 5,
z = math.random(-10, 10) / 9,
})
end
end
else -- drop single item in a stack
local item = def[2][1]
if not minetest.registered_items[item] then
item = ItemStack("default:coal_lump " .. tonumber(num))
else
item = ItemStack(item .. " " .. tonumber(num))
end
local obj = minetest.add_item(pos, item)
if obj then
obj:set_velocity({
x = math.random(-10, 10) / 9,
y = 5,
z = math.random(-10, 10) / 9,
})
end
end
end
local lb_lightning = function(pos, digger, def)
local nod = def[2]
if not minetest.registered_nodes[nod] then
nod = "fire:basic_flame"
end
pos = digger:get_pos()
if nod then
minetest.set_node(pos, {name = nod})
end
minetest.add_particle({
pos = pos,
velocity = {x = 0, y = 0, z = 0},
acceleration = {x = 0, y = 0, z = 0},
expirationtime = 1.0,
collisiondetection = false,
texture = "lucky_lightning.png",
size = math.random(100, 150),
glow = 15,
})
entity_physics(pos, 2)
minetest.sound_play("lightning", {
pos = pos,
gain = 1.0,
max_hear_distance = 25
})
end
local lb_falling = function(pos, digger, def)
local nods = def[2]
local switch = def[3]
local spread = def[4]
local range = def[5] or 5
if switch == 1 then
pos = digger:get_pos()
end
if spread then
pos.y = pos.y + 10
else
pos.y = pos.y + #nods
end
minetest.remove_node(pos)
local pos2 = {x = pos.x, y = pos.y, z = pos.z}
for s = 1, #nods do
minetest.after(0.5 * s, function()
if spread then
pos2.x = pos.x + math.random(-range, range)
pos2.z = pos.z + math.random(-range, range)
end
local n = minetest.registered_nodes[nods[s]]
if n then
local obj = minetest.add_entity(pos2, "__builtin:falling_node")
obj:get_luaentity():set_node(n)
end
end)
end
end
local lb_troll = function(pos, def)
local nod = def[2]
local snd = def[3]
local exp = def[4]
minetest.set_node(pos, {name = nod})
if snd then
minetest.sound_play(snd, {
pos = pos,
gain = 1.0,
max_hear_distance = 10
})
end
if not minetest.registered_nodes[nod] then
nod = "default:goldblock"
end
minetest.after(2.0, function()
if exp then
minetest.set_node(pos, {name = "air"})
explode(pos, 2)
else
minetest.set_node(pos, {name = "air"})
minetest.sound_play("default_hard_footstep", {
pos = pos,
gain = 1.0,
max_hear_distance = 10
})
end
end)
end
local lb_floor = function(pos, def)
local size = def[2] or 1
local nods = def[3] or {"default:dirt"}
local offs = def[4] or 0
local num = 1
for x = 0, size - 1 do
for z = 0, size - 1 do
minetest.after(0.5 * num, function()
minetest.set_node({
x = (pos.x + x) - offs,
y = pos.y - 1,
z = (pos.z + z) - offs
}, {name = nods[math.random(#nods)]})
minetest.sound_play("default_place_node", {
pos = pos,
gain = 1.0,
max_hear_distance = 10
})
end)
num = num + 1
end
end
end
-- this is what happens when you dig a lucky block
function lucky_block:open(pos, digger, blocks_list)
-- check for custom blocks list or use default
blocks_list = blocks_list or lucky_list
-- make sure it's really random
math.randomseed(minetest.get_timeofday() + pos.x + pos.z) -- os.time()
local luck = math.random(1, #blocks_list) ; -- luck = 1
local action = blocks_list[luck][1]
-- print ("luck ["..luck.." of "..#blocks_list.."]", action)
-- place schematic
if action == "sch" then
lb_schematic(pos, digger, blocks_list[luck])
-- place node (if chest then fill chest)
elseif action == "nod" then
lb_node(pos, digger, blocks_list[luck])
-- place entity
elseif action == "spw" then
lb_spawn(pos, digger, blocks_list[luck])
-- explosion
elseif action == "exp" then
lb_explode(pos, blocks_list[luck])
-- teleport
elseif action == "tel" then
lb_teleport(pos, digger, blocks_list[luck])
-- drop items
elseif action == "dro" then
lb_drop(pos, digger, blocks_list[luck])
-- lightning strike
elseif action == "lig" then
lb_lightning(pos, digger, blocks_list[luck])
-- falling nodes
elseif action == "fal" then
lb_falling(pos, digger, blocks_list[luck])
-- troll block, disappears or explodes after 2 seconds
elseif action == "tro" then
lb_troll(pos, blocks_list[luck])
-- floor paint
elseif action == "flo" then
lb_floor(pos, blocks_list[luck])
-- custom function
elseif action == "cus" then
local func = blocks_list[luck][2]
if func then func(pos, digger) end
end
end
-- lucky block itself
minetest.register_node('lucky_block:lucky_block', {
description = S("Lucky Block"),
tiles = {{
name = "lucky_block_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 1
},
}},
inventory_image = minetest.inventorycube("lucky_block.png"),
sunlight_propagates = false,
is_ground_content = false,
paramtype = "light",
light_source = 3,
groups = {oddly_breakable_by_hand = 3, unbreakable = 1},
drop = {},
sounds = default.node_sound_wood_defaults(),
on_dig = function(pos, node, digger)
minetest.set_node(pos, {name = "air"})
lucky_block:open(pos, digger)
end,
on_blast = function() end,
})
minetest.register_craft({
output = "lucky_block:lucky_block",
recipe = {
{"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"},
{"default:gold_ingot", "default:chest", "default:gold_ingot"},
{"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}
}
})
-- super lucky block
minetest.register_node('lucky_block:super_lucky_block', {
description = S("Super Lucky Block (use pick)"),
tiles = {{
name = "lucky_block_super_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 1
},
}},
inventory_image = minetest.inventorycube("lucky_block_super.png"),
sunlight_propagates = false,
is_ground_content = false,
paramtype = "light",
groups = {cracky = 1, level = 2, unbreakable = 1},
drop = {},
sounds = default.node_sound_stone_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", "Super Lucky Block")
end,
on_dig = function(pos)
if math.random(1, 10) < 8 then
minetest.set_node(pos, {name = "air"})
effect(pos, 25, "tnt_smoke.png", 8, 8, 1, -10, 0)
minetest.sound_play("fart1", {
pos = pos,
gain = 1.0,
max_hear_distance = 10
})
if math.random(1, 5) == 1 then
pos.y = pos.y + 0.5
minetest.add_item(pos, "default:goldblock " .. math.random(1, 5))
end
else
minetest.set_node(pos, {name = "lucky_block:lucky_block"})
end
end,
on_blast = function() end,
})
minetest.after(0, function()
print (S("[MOD] Lucky Blocks loaded (@1 in total)", #lucky_list))
end)

View File

@ -0,0 +1,45 @@
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.
-- Get the latest version of this file at:
-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
local function format(str, ...)
local args = { ... }
local function repl(escape, open, num, close)
if escape == "" then
local replacement = tostring(args[tonumber(num)])
if open == "" then
replacement = replacement..close
end
return replacement
else
return "@"..open..num..close
end
end
return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
end
local gettext, ngettext
if minetest.get_modpath("intllib") then
if intllib.make_gettext_pair then
-- New method using gettext.
gettext, ngettext = intllib.make_gettext_pair()
else
-- Old method using text files.
gettext = intllib.Getter()
end
end
-- Fill in missing functions.
gettext = gettext or function(msgid, ...)
return format(msgid, ...)
end
ngettext = ngettext or function(msgid, msgid_plural, n, ...)
return format(n==1 and msgid or msgid_plural, ...)
end
return gettext, ngettext

View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2016 TenPlus1
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,50 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-05-14 08:34+0200\n"
"PO-Revision-Date: 2017-08-28 11:14+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: init.lua
msgid "Stop hitting yourself!"
msgstr "Прекратите удары себя"
#: init.lua
msgid "Dry shrub takeover!"
msgstr "Поглощение сухих кустов"
#: init.lua
msgid "Random teleport!"
msgstr "Случайный телепорт!"
#: init.lua
msgid "Lucky Block"
msgstr "Удачливый блок"
#: init.lua
msgid "Super Lucky Block (use pick)"
msgstr "Супер удачливый блок (используйте кирку)"
#: init.lua
msgid "[MOD] Lucky Blocks loaded (@1 in total)"
msgstr "[MOD] Удачливый блок нагруженный (Всего @1)"
#: blocks.lua
msgid "Super Mega Magenta Ultra Screwdriver 2500\n(left-click to rotate face, right-click to rotates axis)"
msgstr "Пурпурная супер мега ультра отвёртка 2500\n(левая кнопка для вращения лицевой части, правая кнопка для вращения осей)"
#: blocks.lua
msgid "Void Mirror (Place to see through solid walls during daytime"
msgstr "Пустое зеркало (Установите, чтобы видеть сквозь сплошные стены в дневное время)"

View File

@ -0,0 +1,50 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-05-14 08:34+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: init.lua
msgid "Stop hitting yourself!"
msgstr ""
#: init.lua
msgid "Dry shrub takeover!"
msgstr ""
#: init.lua
msgid "Random teleport!"
msgstr ""
#: init.lua
msgid "Lucky Block"
msgstr ""
#: init.lua
msgid "Super Lucky Block (use pick)"
msgstr ""
#: init.lua
msgid "[MOD] Lucky Blocks loaded (@1 in total)"
msgstr ""
#: blocks.lua
msgid "Super Mega Magenta Ultra Screwdriver 2500\n(left-click to rotate face, right-click to rotates axis)"
msgstr ""
#: blocks.lua
msgid "Void Mirror (Place to see through solid walls during daytime"
msgstr ""

View File

@ -0,0 +1 @@
name = lucky_block

Binary file not shown.

272
mods/lucky_block/schems.lua Normal file
View File

@ -0,0 +1,272 @@
-- Generate schematics
local air = {name = "air"}
local san = {name = "default:sand"}
local sst = {name = "default:sandstone"}
local ssb = {name = "default:sandstonebrick"}
local luc = {name = "lucky_block:lucky_block"}
local lav = {name = "default:lava_source"}
local dir = {name = "default:dirt"}
local sow = {name = "farming:soil_wet"}
local wat = {name = "default:water_source"}
local whe = {name = "farming:wheat_8"}
local cot = {name = "farming:cotton_8"}
local obg = {name = "default:obsidian_glass"}
local fir = {name = "fire:basic_flame"}
local obs = {name = "default:obsidian"}
local platform = {
size = {x = 5, y = 3, z = 5},
data = {
sst, sst, sst, sst, sst,
ssb, ssb, ssb, ssb, ssb,
ssb, ssb, ssb, ssb, ssb,
sst, sst, sst, sst, sst,
ssb, luc, air, luc, ssb,
ssb, air, air, air, ssb,
sst, sst, sst, sst, sst,
ssb, air, air, air, ssb,
ssb, air, air, air, ssb,
sst, sst, sst, sst, sst,
ssb, luc, air, luc, ssb,
ssb, air, air, air, ssb,
sst, sst, sst, sst, sst,
ssb, ssb, ssb, ssb, ssb,
ssb, ssb, ssb, ssb, ssb,
},
}
local insta_farm = {
size = {x = 5, y = 3, z = 3},
data = {
dir, dir, dir, dir, dir,
sow, sow, sow, sow, sow,
cot, cot, cot, cot, cot,
sow, dir, dir, dir, sow,
sow, wat, wat, wat, sow,
cot, air, air, air, whe,
dir, dir, dir, dir, san,
sow, sow, sow, sow, sow,
whe, whe, whe, whe, whe,
},
}
local lava_trap = {
size = {x = 3, y = 6, z = 3},
data = {
lav, lav, lav,
air, air, air,
air, air, air,
air, air, air,
air, air, air,
air, air, air,
lav, lav, lav,
air, air, air,
air, air, air,
air, air, air,
air, air, air,
air, air, air,
lav, lav, lav,
air, air, air,
air, air, air,
air, air, air,
air, air, air,
air, air, air,
},
}
local sand_trap = {
size = {x = 3, y = 3, z = 3},
data = {
san, san, san,
san, san, san,
san, san, san,
san, san, san,
san, san, san,
san, san, san,
san, san, san,
san, san, san,
san, san, san,
},
}
local water_trap = {
size = {x = 3, y = 3, z = 3},
data = {
obg, obg, obg,
obg, obg, obg,
obg, obg, obg,
obg, obg, obg,
obg, wat, obg,
obg, obg, obg,
obg, obg, obg,
obg, obg, obg,
obg, obg, obg,
},
}
local fire_trap = {
size = {x = 3, y = 3, z = 3},
data = {
fir, fir, fir,
fir, fir, fir,
fir, fir, fir,
fir, fir, fir,
fir, fir, fir,
fir, fir, fir,
fir, fir, fir,
fir, fir, fir,
fir, fir, fir,
},
}
local obsidian_trap = {
size = {x = 3, y = 3, z = 3},
data = {
obs, obs, obs,
obs, obs, obs,
obs, obs, obs,
obs, air, obs,
obs, air, obs,
obs, lav, obs,
obs, obs, obs,
obs, obs, obs,
obs, obs, obs,
},
}
-- add schematics to list
lucky_block:add_schematics({
{"watertrap", water_trap, {x = 1, y = 0, z = 1}},
{"sandtrap", sand_trap, {x = 1, y = 0, z = 1}},
{"lavatrap", lava_trap, {x = 1, y = 5, z = 1}},
{"platform", platform, {x = 2, y = 1, z = 2}},
{"instafarm", insta_farm, {x = 2, y = 2, z = 1}},
{"firetrap", fire_trap, {x = 1, y = 0, z = 1}},
{"obsidiantrap", obsidian_trap, {x = 1, y = 0, z = 1}},
})
-- wishing well
minetest.register_node("lucky_block:well_block", {
description = "Well Block",
tiles = {"default_glass.png"},
light_source = 5,
groups = {not_in_creative_inventory = 1, unbreakable = 1},
on_blast = function() end,
drop = {},
})
local path = minetest.get_modpath("lucky_block") .. "/schematics/"
lucky_block:add_schematics({
{"wishingwell", path .. "lb_wishing_well.mts", {x = 1, y = 1, z = 1}},
})
-- Global list containing well blocks that can be dropped
lucky_block.wellblocks = {
{"default:ice", 7},
{"default:bronzeblock", 5},
{"default:coalblock", 5},
{"default:sand", 7},
{"default:goldblock", 5},
{"default:cactus", 7},
{"default:cobble", 7},
{"default:brick", 8},
{"default:desert_sand", 7},
{"default:obsidian", 7},
{"default:diamondblock", 4},
{"default:dirt", 7},
{"default:clay", 7},
{"default:copperblock", 5},
{"default:mese", 5},
{"default:silver_sand", 7},
{"default:snowblock", 7},
{"default:mossycobble", 7},
{"default:lava_source", 5},
}
local add_wblock = function(name, number)
local total = #lucky_block.wellblocks
lucky_block.wellblocks[total + 1] = {name, number}
end
-- Add additional well blocks
if minetest.get_modpath("tnt") then
add_wblock("tnt:tnt_burning", 8)
add_wblock("tnt:tnt_burning", 4)
add_wblock("tnt:tnt_burning", 8)
end
if minetest.get_modpath("ethereal") then
add_wblock("ethereal:crystal_block", 5)
end
if minetest.get_modpath("bones") then
add_wblock("bones:bones", 5)
end
minetest.register_abm({
label = "Lucky Block Wishing Well Block",
nodenames = {"lucky_block:well_block"},
interval = 2.0,
chance = 1,
catch_up = false,
action = function(pos, node, active_object_count, active_object_count_wider)
for _,object in pairs(minetest.get_objects_inside_radius(pos, 1.2)) do
if object and object:is_player() then
minetest.swap_node(pos, {name = "default:glass"})
minetest.sound_play("default_tool_breaks", {
pos = pos,
gain = 1.0,
max_hear_distance = 10
})
local b_no = math.random(#lucky_block.wellblocks)
local item = lucky_block.wellblocks[b_no][1]
for n = 1, lucky_block.wellblocks[b_no][2] do
local nod = minetest.registered_nodes[item]
if nod then
local obj = minetest.add_entity({
x = pos.x + math.random(-7, 7),
y = pos.y + 7,
z = pos.z + math.random(-7, 7)
}, "__builtin:falling_node")
obj:get_luaentity():set_node(nod)
end
end
break
end
end
end,
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B