Find and add a lucky block mod
5
ROADMAP
|
@ -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
|
@ -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
|
||||
|
|
|
@ -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)
|
|
@ -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.
|
|
@ -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},
|
||||
})
|
|
@ -0,0 +1,4 @@
|
|||
default
|
||||
tnt?
|
||||
screwdriver?
|
||||
intllib?
|
|
@ -0,0 +1 @@
|
|||
Adds lucky blocks into the game which may give good, bad, hurtful items when open :)
|
|
@ -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)
|
||||
|
|
@ -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
|
|
@ -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.
|
|
@ -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 "Пустое зеркало (Установите, чтобы видеть сквозь сплошные стены в дневное время)"
|
|
@ -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 ""
|
|
@ -0,0 +1 @@
|
|||
name = lucky_block
|
|
@ -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,
|
||||
})
|
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 509 B |
After Width: | Height: | Size: 175 B |
After Width: | Height: | Size: 175 B |
After Width: | Height: | Size: 150 B |
After Width: | Height: | Size: 150 B |
After Width: | Height: | Size: 5.1 KiB |
After Width: | Height: | Size: 166 B |
After Width: | Height: | Size: 202 B |