This commit is contained in:
Maksim Gamarnik 2015-12-06 15:00:12 +02:00
parent ce7924895a
commit 1797862bf9
23 changed files with 229 additions and 64 deletions

View File

@ -347,6 +347,10 @@ function core.item_place(itemstack, placer, pointed_thing, param2)
return itemstack return itemstack
end end
function core.item_secondary_use(itemstack, placer)
return itemstack
end
function core.item_drop(itemstack, dropper, pos) function core.item_drop(itemstack, dropper, pos)
if dropper and dropper:is_player() then if dropper and dropper:is_player() then
local v = dropper:get_look_dir() local v = dropper:get_look_dir()
@ -605,6 +609,7 @@ core.craftitemdef_default = {
-- Interaction callbacks -- Interaction callbacks
on_place = redef_wrapper(core, 'item_place'), -- core.item_place on_place = redef_wrapper(core, 'item_place'), -- core.item_place
on_drop = redef_wrapper(core, 'item_drop'), -- core.item_drop on_drop = redef_wrapper(core, 'item_drop'), -- core.item_drop
on_secondary_use = redef_wrapper(core, 'item_secondary_use'),
on_use = nil, on_use = nil,
} }
@ -622,6 +627,7 @@ core.tooldef_default = {
-- Interaction callbacks -- Interaction callbacks
on_place = redef_wrapper(core, 'item_place'), -- core.item_place on_place = redef_wrapper(core, 'item_place'), -- core.item_place
on_secondary_use = redef_wrapper(core, 'item_secondary_use'),
on_drop = redef_wrapper(core, 'item_drop'), -- core.item_drop on_drop = redef_wrapper(core, 'item_drop'), -- core.item_drop
on_use = nil, on_use = nil,
} }
@ -640,6 +646,7 @@ core.noneitemdef_default = { -- This is used for the hand and unknown items
-- Interaction callbacks -- Interaction callbacks
on_place = redef_wrapper(core, 'item_place'), on_place = redef_wrapper(core, 'item_place'),
on_secondary_use = redef_wrapper(core, 'item_secondary_use'),
on_drop = nil, on_drop = nil,
on_use = nil, on_use = nil,
} }

View File

@ -272,6 +272,7 @@ core.register_item(":unknown", {
description = "Unknown Item", description = "Unknown Item",
inventory_image = "unknown_item.png", inventory_image = "unknown_item.png",
on_place = core.item_place, on_place = core.item_place,
on_secondary_use = core.item_secondary_use,
on_drop = core.item_drop, on_drop = core.item_drop,
groups = {not_in_creative_inventory=1}, groups = {not_in_creative_inventory=1},
diggable = true, diggable = true,

View File

@ -1,25 +0,0 @@
option(ENABLE_LUAJIT "Enable LuaJIT support" TRUE)
mark_as_advanced(LUA_LIBRARY LUA_INCLUDE_DIR)
set(USE_LUAJIT FALSE)
if(ENABLE_LUAJIT)
find_library(LUA_LIBRARY luajit
NAMES luajit-5.1)
find_path(LUA_INCLUDE_DIR luajit.h
NAMES luajit.h
PATH_SUFFIXES luajit-2.0)
if(LUA_LIBRARY AND LUA_INCLUDE_DIR)
set(USE_LUAJIT TRUE)
endif()
else()
message (STATUS "LuaJIT detection disabled! (ENABLE_LUAJIT=0)")
endif()
if(NOT USE_LUAJIT)
message(STATUS "LuaJIT not found, using bundled Lua.")
set(LUA_LIBRARY "lua")
set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
add_subdirectory(lua)
endif()

View File

@ -0,0 +1,50 @@
# Locate LuaJIT library
# This module defines
# LUAJIT_FOUND, if false, do not try to link to Lua
# LUA_INCLUDE_DIR, where to find lua.h
# LUA_VERSION_STRING, the version of Lua found (since CMake 2.8.8)
#
# This module is similar to FindLua51.cmake except that it finds LuaJit instead.
FIND_PATH(LUA_INCLUDE_DIR luajit.h
HINTS
$ENV{LUA_DIR}
PATH_SUFFIXES include/luajit-2.0 include/luajit-5_1-2.0 include
PATHS
~/Library/Frameworks
/Library/Frameworks
/sw # Fink
/opt/local # DarwinPorts
/opt/csw # Blastwave
/opt
)
FIND_LIBRARY(LUA_LIBRARY
NAMES luajit-5.1
HINTS
$ENV{LUA_DIR}
PATH_SUFFIXES lib64 lib
PATHS
~/Library/Frameworks
/Library/Frameworks
/sw
/opt/local
/opt/csw
/opt
)
IF(LUA_INCLUDE_DIR AND EXISTS "${LUA_INCLUDE_DIR}/luajit.h")
FILE(STRINGS "${LUA_INCLUDE_DIR}/luajit.h" lua_version_str REGEX "^#define[ \t]+LUA_RELEASE[ \t]+\"LuaJIT .+\"")
STRING(REGEX REPLACE "^#define[ \t]+LUA_RELEASE[ \t]+\"LuaJIT ([^\"]+)\".*" "\\1" LUA_VERSION_STRING "${lua_version_str}")
UNSET(lua_version_str)
ENDIF()
INCLUDE(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set LUAJIT_FOUND to TRUE if
# all listed variables are TRUE
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LuaJit
REQUIRED_VARS LUA_LIBRARY LUA_INCLUDE_DIR
VERSION_VAR LUA_VERSION_STRING)
MARK_AS_ADVANCED(LUA_INCLUDE_DIR LUA_LIBRARY LUA_MATH_LIBRARY)

View File

@ -763,7 +763,7 @@ Creates veins of ore varying in density by according to the intersection of two
instances of 3d perlin noise with diffferent seeds, both described by instances of 3d perlin noise with diffferent seeds, both described by
`noise_params`. `random_factor` varies the influence random chance has on `noise_params`. `random_factor` varies the influence random chance has on
placement of an ore inside the vein, which is `1` by default. Note that placement of an ore inside the vein, which is `1` by default. Note that
modifying this parameter may require adjusting `noise_threshhold`. modifying this parameter may require adjusting `noise_threshold`.
The parameters `clust_scarcity`, `clust_num_ores`, and `clust_size` are ignored The parameters `clust_scarcity`, `clust_num_ores`, and `clust_size` are ignored
by this ore type. This ore type is difficult to control since it is sensitive by this ore type. This ore type is difficult to control since it is sensitive
to small changes. The following is a decent set of parameters to work from: to small changes. The following is a decent set of parameters to work from:
@ -777,7 +777,7 @@ to small changes. The following is a decent set of parameters to work from:
persist = 0.5, persist = 0.5,
flags = "eased", flags = "eased",
}, },
noise_threshhold = 1.6 noise_threshold = 1.6
WARNING: Use this ore type *very* sparingly since it is ~200x more WARNING: Use this ore type *very* sparingly since it is ~200x more
computationally expensive than any other ore. computationally expensive than any other ore.
@ -1921,7 +1921,11 @@ Call these functions only at load time!
* Should be called by the authentication handler if privileges changes. * Should be called by the authentication handler if privileges changes.
* To report everybody, set `name=nil`. * To report everybody, set `name=nil`.
* `minetest.get_password_hash(name, raw_password)` * `minetest.get_password_hash(name, raw_password)`
* Convert a name-password pair to a password hash that Minetest can use * Convert a name-password pair to a password hash that Minetest can use.
* The returned value alone is not a good basis for password checks based
* on comparing the password hash in the database with the password hash
* from the function, with an externally provided password, as the hash
* in the db might use the new SRP verifier format.
* `minetest.string_to_privs(str)`: returns `{priv1=true,...}` * `minetest.string_to_privs(str)`: returns `{priv1=true,...}`
* `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."` * `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."`
* Convert between two privilege representations * Convert between two privilege representations
@ -3303,6 +3307,11 @@ Definition tables
--[[ --[[
^ Shall place item and return the leftover itemstack ^ Shall place item and return the leftover itemstack
^ default: minetest.item_place ]] ^ default: minetest.item_place ]]
on_secondary_use = func(itemstack, user, pointed_thing),
--[[
^ Same as on_place but called when pointing at nothing.
^ pointed_thing : always { type = "nothing" }
]]
on_drop = func(itemstack, dropper, pos), on_drop = func(itemstack, dropper, pos),
--[[ --[[
^ Shall drop item and return the leftover itemstack ^ Shall drop item and return the leftover itemstack
@ -3563,7 +3572,7 @@ Definition tables
y_max = 64, y_max = 64,
flags = "", flags = "",
-- ^ Attributes for this ore generation -- ^ Attributes for this ore generation
noise_threshhold = 0.5, noise_threshold = 0.5,
-- ^ If noise is above this threshold, ore is placed. Not needed for a uniform distribution -- ^ If noise is above this threshold, ore is placed. Not needed for a uniform distribution
noise_params = {offset=0, scale=1, spread={x=100, y=100, z=100}, seed=23, octaves=3, persist=0.70} noise_params = {offset=0, scale=1, spread={x=100, y=100, z=100}, seed=23, octaves=3, persist=0.70}
-- ^ NoiseParams structure describing the perlin noise used for ore distribution. -- ^ NoiseParams structure describing the perlin noise used for ore distribution.
@ -3578,6 +3587,51 @@ Definition tables
-- ^ Can be a list of (or a single) biome names, IDs, or definitions. -- ^ Can be a list of (or a single) biome names, IDs, or definitions.
} }
### Biome definition (`register_biome`)
{
name = "tundra",
node_dust = "default:snow",
-- ^ Node dropped onto upper surface after all else is generated.
node_top = "default:dirt_with_snow",
depth_top = 1,
-- ^ Node forming surface layer of biome and thickness of this layer.
node_filler = "default:permafrost",
depth_filler = 3,
-- ^ Node forming lower layer of biome and thickness of this layer.
node_stone = "default:bluestone",
-- ^ Node that replaces all stone nodes between roughly y_min and y_max.
node_water_top = "default:ice",
depth_water_top = 10,
-- ^ Node forming a surface layer in seawater with the defined thickness.
node_water = "",
-- ^ Node that replaces all seawater nodes not in the defined surface layer.
node_river_water = "default:ice",
-- ^ Node that replaces river water in mapgens that use default:river_water.
y_min = 1,
y_max = 31000,
-- ^ Lower and upper limits for biome.
-- ^ Because biome is not recalculated for every node in a node column
-- ^ some biome materials can exceed their limits, especially stone.
-- ^ For each node column in a mapchunk, biome is only recalculated at column
-- ^ top and at each of these surfaces:
-- ^ Ground below air, water below air, ground below water.
-- ^ The selected biome then stays in effect for all nodes below until
-- ^ column base or the next biome recalculation.
heat_point = 0,
humidity_point = 50,
-- ^ Characteristic average temperature and humidity for the biome.
-- ^ These values create 'biome points' on a voronoi diagram that has heat
-- ^ and humidity as axes. The resulting voronoi cells determine which
-- ^ heat/humidity points belong to which biome, and therefore determine
-- ^ the area and location of each biome in the world.
-- ^ The biome points need to be carefully and evenly spaced on the voronoi
-- ^ diagram to result in roughly equal size biomes.
-- ^ Heat and humidity have average values of 50, vary mostly between
-- ^ 0 and 100 but also often exceed these values.
-- ^ Heat is not in degrees celcius, both values are abstract.
}
### Decoration definition (`register_decoration`) ### Decoration definition (`register_decoration`)
{ {

View File

@ -155,8 +155,23 @@ if(ENABLE_FREETYPE)
endif() endif()
endif(ENABLE_FREETYPE) endif(ENABLE_FREETYPE)
# LuaJIT
find_package(Lua REQUIRED) option(ENABLE_LUAJIT "Enable LuaJIT support" TRUE)
set(USE_LUAJIT FALSE)
if(ENABLE_LUAJIT)
find_package(LuaJIT)
if(LUAJIT_FOUND)
set(USE_LUAJIT TRUE)
endif(LUAJIT_FOUND)
else()
message (STATUS "LuaJIT detection disabled! (ENABLE_LUAJIT=0)")
endif()
if(NOT USE_LUAJIT)
message(STATUS "LuaJIT not found, using bundled Lua.")
set(LUA_LIBRARY "lua")
set(LUA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/lua/src")
add_subdirectory(lua)
endif()
find_package(GMP REQUIRED) find_package(GMP REQUIRED)

View File

@ -2,7 +2,7 @@
# Do not add CGUITTFont.cpp to the line below. # Do not add CGUITTFont.cpp to the line below.
# xCGUITTFont.cpp is a wrapper file that includes # xCGUITTFont.cpp is a wrapper file that includes
# additional required headers. # additional required headers.
add_library(cguittfont xCGUITTFont.cpp) add_library(cguittfont STATIC xCGUITTFont.cpp)
if(FREETYPE_PKGCONFIG_FOUND) if(FREETYPE_PKGCONFIG_FOUND)
set_target_properties(cguittfont set_target_properties(cguittfont

View File

@ -946,6 +946,7 @@ void Client::interact(u8 action, const PointedThing& pointed)
2: digging completed 2: digging completed
3: place block or item (to abovesurface) 3: place block or item (to abovesurface)
4: use item 4: use item
5: perform secondary action of item
*/ */
NetworkPacket pkt(TOSERVER_INTERACT, 1 + 2 + 0); NetworkPacket pkt(TOSERVER_INTERACT, 1 + 2 + 0);

View File

@ -65,6 +65,9 @@ DungeonGen::DungeonGen(Mapgen *mapgen, DungeonParams *dparams)
dp.np_wetness = nparams_dungeon_wetness; dp.np_wetness = nparams_dungeon_wetness;
dp.np_density = nparams_dungeon_density; dp.np_density = nparams_dungeon_density;
} }
// For mapgens using river water
dp.c_river_water = mg->ndef->getId("mapgen_river_water_source");
} }
@ -87,7 +90,7 @@ void DungeonGen::generate(u32 bseed, v3s16 nmin, v3s16 nmax)
u32 i = vm->m_area.index(nmin.X, y, z); u32 i = vm->m_area.index(nmin.X, y, z);
for (s16 x = nmin.X; x <= nmax.X; x++) { for (s16 x = nmin.X; x <= nmax.X; x++) {
content_t c = vm->m_data[i].getContent(); content_t c = vm->m_data[i].getContent();
if (c == CONTENT_AIR || c == dp.c_water) if (c == CONTENT_AIR || c == dp.c_water || c == dp.c_river_water)
vm->m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE; vm->m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE;
i++; i++;
} }
@ -389,7 +392,8 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir,
if (partcount != 0) if (partcount != 0)
p.Y += make_stairs; p.Y += make_stairs;
if (vm->m_area.contains(p) && vm->m_area.contains(p + v3s16(0, 1, 0))) { if (vm->m_area.contains(p) && vm->m_area.contains(p + v3s16(0, 1, 0)) &&
vm->m_area.contains(v3s16(p.X - dir.X, p.Y - 1, p.Z - dir.Z))) {
if (make_stairs) { if (make_stairs) {
makeFill(p + v3s16(-1, -1, -1), makeFill(p + v3s16(-1, -1, -1),
dp.holesize + v3s16(2, 3, 2), dp.holesize + v3s16(2, 3, 2),

View File

@ -40,6 +40,7 @@ int dir_to_facedir(v3s16 d);
struct DungeonParams { struct DungeonParams {
content_t c_water; content_t c_water;
content_t c_river_water;
content_t c_cobble; content_t c_cobble;
content_t c_moss; content_t c_moss;
content_t c_stair; content_t c_stair;

View File

@ -1536,6 +1536,7 @@ protected:
void processPlayerInteraction(std::vector<aabb3f> &highlight_boxes, void processPlayerInteraction(std::vector<aabb3f> &highlight_boxes,
GameRunData *runData, f32 dtime, bool show_hud, GameRunData *runData, f32 dtime, bool show_hud,
bool show_debug); bool show_debug);
void handlePointingAtNothing(GameRunData *runData, const ItemStack &playerItem);
void handlePointingAtNode(GameRunData *runData, void handlePointingAtNode(GameRunData *runData,
const PointedThing &pointed, const ItemDefinition &playeritem_def, const PointedThing &pointed, const ItemDefinition &playeritem_def,
const ToolCapabilities &playeritem_toolcap, f32 dtime); const ToolCapabilities &playeritem_toolcap, f32 dtime);
@ -3621,6 +3622,8 @@ void Game::processPlayerInteraction(std::vector<aabb3f> &highlight_boxes,
} else if (input->getLeftState()) { } else if (input->getLeftState()) {
// When button is held down in air, show continuous animation // When button is held down in air, show continuous animation
runData->left_punch = true; runData->left_punch = true;
} else if (input->getRightClicked()) {
handlePointingAtNothing(runData, playeritem);
} }
runData->pointed_old = pointed; runData->pointed_old = pointed;
@ -3636,6 +3639,15 @@ void Game::processPlayerInteraction(std::vector<aabb3f> &highlight_boxes,
} }
void Game::handlePointingAtNothing(GameRunData *runData, const ItemStack &playerItem)
{
infostream << "Right Clicked in Air" << std::endl;
PointedThing fauxPointed;
fauxPointed.type = POINTEDTHING_NOTHING;
client->interact(5, fauxPointed);
}
void Game::handlePointingAtNode(GameRunData *runData, void Game::handlePointingAtNode(GameRunData *runData,
const PointedThing &pointed, const ItemDefinition &playeritem_def, const PointedThing &pointed, const ItemDefinition &playeritem_def,
const ToolCapabilities &playeritem_toolcap, f32 dtime) const ToolCapabilities &playeritem_toolcap, f32 dtime)

View File

@ -148,8 +148,8 @@ MapgenFlatParams::MapgenFlatParams()
np_terrain = NoiseParams(0, 1, v3f(600, 600, 600), 7244, 5, 0.6, 2.0); np_terrain = NoiseParams(0, 1, v3f(600, 600, 600), 7244, 5, 0.6, 2.0);
np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0); np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0);
np_cave1 = NoiseParams(0, 12, v3f(128, 128, 128), 52534, 4, 0.5, 2.0); np_cave1 = NoiseParams(0, 12, v3f(96, 96, 96), 52534, 4, 0.5, 2.0);
np_cave2 = NoiseParams(0, 12, v3f(128, 128, 128), 10325, 4, 0.5, 2.0); np_cave2 = NoiseParams(0, 12, v3f(96, 96, 96), 10325, 4, 0.5, 2.0);
} }
@ -559,7 +559,7 @@ void MapgenFlat::generateCaves(s16 max_stone_y)
for (s16 x = node_min.X; x <= node_max.X; x++, vi++, index++) { for (s16 x = node_min.X; x <= node_max.X; x++, vi++, index++) {
float d1 = contour(noise_cave1->result[index]); float d1 = contour(noise_cave1->result[index]);
float d2 = contour(noise_cave2->result[index]); float d2 = contour(noise_cave2->result[index]);
if (d1 * d2 > 0.4f) { if (d1 * d2 > 0.3f) {
content_t c = vm->m_data[vi].getContent(); content_t c = vm->m_data[vi].getContent();
if (!ndef->get(c).is_ground_content || c == CONTENT_AIR) if (!ndef->get(c).is_ground_content || c == CONTENT_AIR)
continue; continue;
@ -574,7 +574,7 @@ void MapgenFlat::generateCaves(s16 max_stone_y)
return; return;
PseudoRandom ps(blockseed + 21343); PseudoRandom ps(blockseed + 21343);
u32 bruises_count = (ps.range(1, 4) == 1) ? ps.range(1, 2) : 0; u32 bruises_count = ps.range(0, 2);
for (u32 i = 0; i < bruises_count; i++) { for (u32 i = 0; i < bruises_count; i++) {
CaveV5 cave(this, &ps); CaveV5 cave(this, &ps);
cave.makeCave(node_min, node_max, max_stone_y); cave.makeCave(node_min, node_max, max_stone_y);

View File

@ -154,8 +154,8 @@ MapgenFractalParams::MapgenFractalParams()
np_seabed = NoiseParams(-14, 9, v3f(600, 600, 600), 41900, 5, 0.6, 2.0); np_seabed = NoiseParams(-14, 9, v3f(600, 600, 600), 41900, 5, 0.6, 2.0);
np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0); np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0);
np_cave1 = NoiseParams(0, 12, v3f(128, 128, 128), 52534, 4, 0.5, 2.0); np_cave1 = NoiseParams(0, 12, v3f(96, 96, 96), 52534, 4, 0.5, 2.0);
np_cave2 = NoiseParams(0, 12, v3f(128, 128, 128), 10325, 4, 0.5, 2.0); np_cave2 = NoiseParams(0, 12, v3f(96, 96, 96), 10325, 4, 0.5, 2.0);
} }
@ -624,7 +624,7 @@ void MapgenFractal::generateCaves(s16 max_stone_y)
for (s16 x = node_min.X; x <= node_max.X; x++, vi++, index++) { for (s16 x = node_min.X; x <= node_max.X; x++, vi++, index++) {
float d1 = contour(noise_cave1->result[index]); float d1 = contour(noise_cave1->result[index]);
float d2 = contour(noise_cave2->result[index]); float d2 = contour(noise_cave2->result[index]);
if (d1 * d2 > 0.4f) { if (d1 * d2 > 0.3f) {
content_t c = vm->m_data[vi].getContent(); content_t c = vm->m_data[vi].getContent();
if (!ndef->get(c).is_ground_content || c == CONTENT_AIR) if (!ndef->get(c).is_ground_content || c == CONTENT_AIR)
continue; continue;
@ -639,7 +639,7 @@ void MapgenFractal::generateCaves(s16 max_stone_y)
return; return;
PseudoRandom ps(blockseed + 21343); PseudoRandom ps(blockseed + 21343);
u32 bruises_count = (ps.range(1, 4) == 1) ? ps.range(1, 2) : 0; u32 bruises_count = ps.range(0, 2);
for (u32 i = 0; i < bruises_count; i++) { for (u32 i = 0; i < bruises_count; i++) {
CaveV5 cave(this, &ps); CaveV5 cave(this, &ps);
cave.makeCave(node_min, node_max, max_stone_y); cave.makeCave(node_min, node_max, max_stone_y);

View File

@ -518,7 +518,7 @@ void MapgenV5::generateCaves(int max_stone_y)
for (s16 x = node_min.X; x <= node_max.X; x++, i++, index++) { for (s16 x = node_min.X; x <= node_max.X; x++, i++, index++) {
float d1 = contour(noise_cave1->result[index]); float d1 = contour(noise_cave1->result[index]);
float d2 = contour(noise_cave2->result[index]); float d2 = contour(noise_cave2->result[index]);
if (d1*d2 > 0.125) { if (d1 * d2 > 0.125f) {
content_t c = vm->m_data[i].getContent(); content_t c = vm->m_data[i].getContent();
if (!ndef->get(c).is_ground_content || c == CONTENT_AIR) if (!ndef->get(c).is_ground_content || c == CONTENT_AIR)
continue; continue;
@ -533,7 +533,7 @@ void MapgenV5::generateCaves(int max_stone_y)
return; return;
PseudoRandom ps(blockseed + 21343); PseudoRandom ps(blockseed + 21343);
u32 bruises_count = (ps.range(1, 4) == 1) ? ps.range(1, 2) : 0; u32 bruises_count = ps.range(0, 2);
for (u32 i = 0; i < bruises_count; i++) { for (u32 i = 0; i < bruises_count; i++) {
CaveV5 cave(this, &ps); CaveV5 cave(this, &ps);
cave.makeCave(node_min, node_max, max_stone_y); cave.makeCave(node_min, node_max, max_stone_y);

View File

@ -157,8 +157,8 @@ MapgenV7Params::MapgenV7Params()
np_ridge_uwater = NoiseParams(0, 1, v3f(1000, 1000, 1000), 85039, 5, 0.6, 2.0); np_ridge_uwater = NoiseParams(0, 1, v3f(1000, 1000, 1000), 85039, 5, 0.6, 2.0);
np_mountain = NoiseParams(-0.6, 1, v3f(250, 350, 250), 5333, 5, 0.63, 2.0); np_mountain = NoiseParams(-0.6, 1, v3f(250, 350, 250), 5333, 5, 0.63, 2.0);
np_ridge = NoiseParams(0, 1, v3f(100, 100, 100), 6467, 4, 0.75, 2.0); np_ridge = NoiseParams(0, 1, v3f(100, 100, 100), 6467, 4, 0.75, 2.0);
np_cave1 = NoiseParams(0, 12, v3f(100, 100, 100), 52534, 4, 0.5, 2.0); np_cave1 = NoiseParams(0, 12, v3f(96, 96, 96), 52534, 4, 0.5, 2.0);
np_cave2 = NoiseParams(0, 12, v3f(100, 100, 100), 10325, 4, 0.5, 2.0); np_cave2 = NoiseParams(0, 12, v3f(96, 96, 96), 10325, 4, 0.5, 2.0);
} }
@ -870,7 +870,7 @@ void MapgenV7::generateCaves(s16 max_stone_y)
for (s16 x = node_min.X; x <= node_max.X; x++, i++, index++) { for (s16 x = node_min.X; x <= node_max.X; x++, i++, index++) {
float d1 = contour(noise_cave1->result[index]); float d1 = contour(noise_cave1->result[index]);
float d2 = contour(noise_cave2->result[index]); float d2 = contour(noise_cave2->result[index]);
if (d1 * d2 > 0.3) { if (d1 * d2 > 0.3f) {
content_t c = vm->m_data[i].getContent(); content_t c = vm->m_data[i].getContent();
if (!ndef->get(c).is_ground_content || c == CONTENT_AIR) if (!ndef->get(c).is_ground_content || c == CONTENT_AIR)
continue; continue;
@ -882,7 +882,7 @@ void MapgenV7::generateCaves(s16 max_stone_y)
} }
PseudoRandom ps(blockseed + 21343); PseudoRandom ps(blockseed + 21343);
u32 bruises_count = (ps.range(1, 4) == 1) ? ps.range(1, 2) : 0; u32 bruises_count = ps.range(0, 2);
for (u32 i = 0; i < bruises_count; i++) { for (u32 i = 0; i < bruises_count; i++) {
CaveV7 cave(this, &ps); CaveV7 cave(this, &ps);
cave.makeCave(node_min, node_max, max_stone_y); cave.makeCave(node_min, node_max, max_stone_y);

View File

@ -61,7 +61,7 @@ public:
s16 y_max; s16 y_max;
u8 ore_param2; // to set node-specific attributes u8 ore_param2; // to set node-specific attributes
u32 flags; // attributes for this ore u32 flags; // attributes for this ore
float nthresh; // threshhold for noise at which an ore is placed float nthresh; // threshold for noise at which an ore is placed
NoiseParams np; // noise for distribution of clusters (NULL for uniform scattering) NoiseParams np; // noise for distribution of clusters (NULL for uniform scattering)
Noise *noise; Noise *noise;
std::set<u8> biomes; std::set<u8> biomes;

View File

@ -1654,6 +1654,23 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
} // action == 4 } // action == 4
/*
5: rightclick air
*/
else if (action == 5) {
ItemStack item = playersao->getWieldedItem();
actionstream << player->getName() << " activates "
<< item.name << std::endl;
if (m_script->item_OnSecondaryUse(
item, playersao)) {
if( playersao->setWieldedItem(item)) {
SendInventory(playersao);
}
}
}
/* /*
Catch invalid actions Catch invalid actions

View File

@ -99,17 +99,17 @@ u32 PcgRandom::range(u32 bound)
Using rand() % 3, the number 0 would be twice as likely to appear. Using rand() % 3, the number 0 would be twice as likely to appear.
With a very large RNG range, the effect becomes less prevalent but With a very large RNG range, the effect becomes less prevalent but
still present. This can be solved by modifying the range of the RNG still present. This can be solved by modifying the range of the RNG
to become a multiple of bound by dropping values above the a threshhold. to become a multiple of bound by dropping values above the a threshold.
In our example, threshhold == 4 - 3 = 1 % 3 == 1, so reject 0, thus In our example, threshold == 4 - 3 = 1 % 3 == 1, so reject 0, thus
making the range 3 with no bias. making the range 3 with no bias.
This loop looks dangerous, but will always terminate due to the This loop looks dangerous, but will always terminate due to the
RNG's property of uniformity. RNG's property of uniformity.
*/ */
u32 threshhold = -bound % bound; u32 threshold = -bound % bound;
u32 r; u32 r;
while ((r = next()) < threshhold) while ((r = next()) < threshold)
; ;
return r % bound; return r % bound;

View File

@ -110,6 +110,32 @@ bool ScriptApiItem::item_OnUse(ItemStack &item,
return true; return true;
} }
bool ScriptApiItem::item_OnSecondaryUse(ItemStack &item, ServerActiveObject *user)
{
SCRIPTAPI_PRECHECKHEADER
int error_handler = PUSH_ERROR_HANDLER(L);
if (!getItemCallback(item.name.c_str(), "on_secondary_use"))
return false;
LuaItemStack::create(L, item);
objectrefGetOrCreate(L, user);
PointedThing pointed;
pointed.type = POINTEDTHING_NOTHING;
pushPointedThing(pointed);
PCALL_RES(lua_pcall(L, 3, 1, error_handler));
if (!lua_isnil(L, -1)) {
try {
item = read_item(L, -1, getServer());
} catch (LuaError &e) {
throw LuaError(std::string(e.what()) + ". item=" + item.name);
}
}
lua_pop(L, 2); // Pop item and error handler
return true;
}
bool ScriptApiItem::item_OnCraft(ItemStack &item, ServerActiveObject *user, bool ScriptApiItem::item_OnCraft(ItemStack &item, ServerActiveObject *user,
const InventoryList *old_craft_grid, const InventoryLocation &craft_inv) const InventoryList *old_craft_grid, const InventoryLocation &craft_inv)
{ {

View File

@ -42,6 +42,8 @@ public:
ServerActiveObject *placer, const PointedThing &pointed); ServerActiveObject *placer, const PointedThing &pointed);
bool item_OnUse(ItemStack &item, bool item_OnUse(ItemStack &item,
ServerActiveObject *user, const PointedThing &pointed); ServerActiveObject *user, const PointedThing &pointed);
bool item_OnSecondaryUse(ItemStack &item,
ServerActiveObject *user);
bool item_OnCraft(ItemStack &item, ServerActiveObject *user, bool item_OnCraft(ItemStack &item, ServerActiveObject *user,
const InventoryList *old_craft_grid, const InventoryLocation &craft_inv); const InventoryList *old_craft_grid, const InventoryLocation &craft_inv);
bool item_CraftPredict(ItemStack &item, ServerActiveObject *user, bool item_CraftPredict(ItemStack &item, ServerActiveObject *user,

View File

@ -944,10 +944,19 @@ int ModApiMapgen::l_register_ore(lua_State *L)
ore->clust_scarcity = getintfield_default(L, index, "clust_scarcity", 1); ore->clust_scarcity = getintfield_default(L, index, "clust_scarcity", 1);
ore->clust_num_ores = getintfield_default(L, index, "clust_num_ores", 1); ore->clust_num_ores = getintfield_default(L, index, "clust_num_ores", 1);
ore->clust_size = getintfield_default(L, index, "clust_size", 0); ore->clust_size = getintfield_default(L, index, "clust_size", 0);
ore->nthresh = getfloatfield_default(L, index, "noise_threshhold", 0);
ore->noise = NULL; ore->noise = NULL;
ore->flags = 0; ore->flags = 0;
//// Get noise_threshold
warn_if_field_exists(L, index, "noise_threshhold",
"Deprecated: new name is \"noise_threshold\".");
int nthresh;
if (!getintfield(L, index, "noise_threshold", nthresh) &&
!getintfield(L, index, "noise_threshhold", nthresh))
nthresh = 0;
ore->nthresh = nthresh;
//// Get y_min/y_max //// Get y_min/y_max
warn_if_field_exists(L, index, "height_min", warn_if_field_exists(L, index, "height_min",
"Deprecated: new name is \"y_min\"."); "Deprecated: new name is \"y_min\".");

View File

@ -269,7 +269,6 @@ private:
OnDemandSoundFetcher *m_fetcher; OnDemandSoundFetcher *m_fetcher;
ALCdevice *m_device; ALCdevice *m_device;
ALCcontext *m_context; ALCcontext *m_context;
bool m_can_vorbis;
int m_next_id; int m_next_id;
std::map<std::string, std::vector<SoundBuffer*> > m_buffers; std::map<std::string, std::vector<SoundBuffer*> > m_buffers;
std::map<int, PlayingSound*> m_sounds_playing; std::map<int, PlayingSound*> m_sounds_playing;
@ -280,7 +279,6 @@ public:
m_fetcher(fetcher), m_fetcher(fetcher),
m_device(NULL), m_device(NULL),
m_context(NULL), m_context(NULL),
m_can_vorbis(false),
m_next_id(1), m_next_id(1),
m_is_initialized(false) m_is_initialized(false)
{ {
@ -295,14 +293,6 @@ public:
return; return;
} }
if(alcIsExtensionPresent(m_device, "EXT_vorbis")){
infostream<<"Audio: Vorbis extension present"<<std::endl;
m_can_vorbis = true;
} else{
infostream<<"Audio: Vorbis extension NOT present"<<std::endl;
m_can_vorbis = false;
}
m_context = alcCreateContext(m_device, NULL); m_context = alcCreateContext(m_device, NULL);
if(!m_context){ if(!m_context){
error = alcGetError(m_device); error = alcGetError(m_device);

View File

@ -8,6 +8,7 @@ if [[ $CC == "clang" ]]; then
sudo apt-get install llvm-3.1 sudo apt-get install llvm-3.1
sudo apt-get install clang sudo apt-get install clang
fi fi
sudo apt-get update
sudo apt-get install p7zip-full sudo apt-get install p7zip-full
if [[ $PLATFORM == "Linux" ]]; then if [[ $PLATFORM == "Linux" ]]; then
sudo apt-get install libirrlicht-dev cmake libbz2-dev libpng12-dev \ sudo apt-get install libirrlicht-dev cmake libbz2-dev libpng12-dev \