forked from VoxeLibre/VoxeLibre
Compare commits
5 Commits
master
...
player-glo
Author | SHA1 | Date |
---|---|---|
AFCMS | 753cdb09d7 | |
AFCMS | a1f56c4190 | |
AFCMS | fbc613d726 | |
AFCMS | bace4f5f20 | |
AFCMS | c7a144aa10 |
|
@ -44,32 +44,32 @@ minetest.register_on_leaveplayer(function(player)
|
|||
controls.players[name] = nil
|
||||
end)
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
for _, player in pairs(get_connected_players()) do
|
||||
mcl_util.register_player_globalstep({
|
||||
execute = function(player, dtime)
|
||||
local player_name = player:get_player_name()
|
||||
local player_controls = player:get_player_control()
|
||||
if controls.players[player_name] then
|
||||
for cname, cbool in pairs(player_controls) do
|
||||
if known_controls[cname] == true then
|
||||
--Press a key
|
||||
if cbool==true and controls.players[player_name][cname][1]==false then
|
||||
for _, func in pairs(controls.registered_on_press) do
|
||||
func(player, cname)
|
||||
for cname, cbool in pairs(player_controls) do
|
||||
if known_controls[cname] == true then
|
||||
--Press a key
|
||||
if cbool==true and controls.players[player_name][cname][1]==false then
|
||||
for _, func in pairs(controls.registered_on_press) do
|
||||
func(player, cname)
|
||||
end
|
||||
controls.players[player_name][cname] = {true, clock()}
|
||||
elseif cbool==true and controls.players[player_name][cname][1]==true then
|
||||
for _, func in pairs(controls.registered_on_hold) do
|
||||
func(player, cname, clock()-controls.players[player_name][cname][2])
|
||||
end
|
||||
--Release a key
|
||||
elseif cbool==false and controls.players[player_name][cname][1]==true then
|
||||
for _, func in pairs(controls.registered_on_release) do
|
||||
func(player, cname, clock()-controls.players[player_name][cname][2])
|
||||
end
|
||||
controls.players[player_name][cname] = {false}
|
||||
end
|
||||
end
|
||||
controls.players[player_name][cname] = {true, clock()}
|
||||
elseif cbool==true and controls.players[player_name][cname][1]==true then
|
||||
for _, func in pairs(controls.registered_on_hold) do
|
||||
func(player, cname, clock()-controls.players[player_name][cname][2])
|
||||
end
|
||||
--Release a key
|
||||
elseif cbool==false and controls.players[player_name][cname][1]==true then
|
||||
for _, func in pairs(controls.registered_on_release) do
|
||||
func(player, cname, clock()-controls.players[player_name][cname][2])
|
||||
end
|
||||
controls.players[player_name][cname] = {false}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end,
|
||||
})
|
|
@ -1,4 +1,5 @@
|
|||
name = controls
|
||||
author = Arcelmi
|
||||
depends = mcl_util
|
||||
description = Controls framework by Arcelmi
|
||||
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
# mcl_util
|
||||
|
||||
Provide utility functions for mcl2
|
||||
|
||||
## mcl_util.register_player_globalstep(def)
|
||||
Used to register a player globalstep.
|
||||
Use this insteed of global step if you need to execute action on all players to avoid calling the same functions multiple time.
|
||||
|
||||
```
|
||||
mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
return true --return false if you want to skip "execute" function
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
--do some cool stuff
|
||||
--will be executed for every player at each server step
|
||||
end,
|
||||
after_execute = function(dtime)
|
||||
end,
|
||||
})
|
||||
```
|
||||
|
||||
## mcl_util.registered_player_globalstep
|
||||
Table containing all registered player globalstep.
|
|
@ -1,3 +1,5 @@
|
|||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
mcl_util = {}
|
||||
|
||||
-- Based on minetest.rotate_and_place
|
||||
|
@ -418,3 +420,5 @@ function mcl_util.get_color(colorstr)
|
|||
return colorstr, hex
|
||||
end
|
||||
end
|
||||
|
||||
dofile(modpath.."/playerstep.lua")
|
|
@ -0,0 +1,25 @@
|
|||
local get_connected_players = minetest.get_connected_players
|
||||
|
||||
mcl_util.registered_player_globalstep = {}
|
||||
local registered_player_globalstep = mcl_util.registered_player_globalstep
|
||||
|
||||
function mcl_util.register_player_globalstep(def)
|
||||
if not def.can_execute then def.can_execute = function() return true end end
|
||||
table.insert(mcl_util.registered_player_globalstep, {can_execute=def.can_execute, func=def.execute})
|
||||
end
|
||||
|
||||
minetest.register_on_mods_loaded(function()
|
||||
minetest.register_globalstep(function(dtime)
|
||||
local players = get_connected_players()
|
||||
for i = 1, #registered_player_globalstep do
|
||||
if registered_player_globalstep[i].can_execute and registered_player_globalstep[i].can_execute(dtime) then
|
||||
for p = 1, #players do
|
||||
registered_player_globalstep[i].func(players[p], dtime)
|
||||
end
|
||||
if registered_player_globalstep[i].after_execute then
|
||||
registered_player_globalstep[i].after_execute(dtime)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end)
|
|
@ -52,3 +52,33 @@ minetest.register_globalstep(function(dtime)
|
|||
timer = 0
|
||||
end
|
||||
end)
|
||||
|
||||
--[[mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
timer = timer + dtime;
|
||||
if timer >= 0.3 then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
local pp = player:get_pos()
|
||||
pp.y = ceil(pp.y)
|
||||
local loc = vector_add(pp, {x=0,y=-1,z=0})
|
||||
if loc ~= nil then
|
||||
local nodeiamon = get_node(loc)
|
||||
if nodeiamon ~= nil then
|
||||
if on_walk[nodeiamon.name] then
|
||||
on_walk[nodeiamon.name](loc, nodeiamon, player)
|
||||
end
|
||||
for i = 1, #registered_globals do
|
||||
registered_globals[i](loc, nodeiamon, player)
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
after_execute = function(dtime)
|
||||
timer = 0
|
||||
end,
|
||||
})]]
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
name = walkover
|
||||
author = lordfingle
|
||||
depends = mcl_util
|
||||
description = Some mode developers have shown an interest in having an `on_walk_over` event. This is useful for pressure-plates and the like.
|
||||
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
--lua locals
|
||||
local get_node = minetest.get_node
|
||||
local get_item_group = minetest.get_item_group
|
||||
local get_node_light = minetest.get_node_light
|
||||
local get_node = minetest.get_node
|
||||
local get_item_group = minetest.get_item_group
|
||||
local get_node_light = minetest.get_node_light
|
||||
local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
|
||||
local new_vector = vector.new
|
||||
local math_random = math.random
|
||||
local get_biome_name = minetest.get_biome_name
|
||||
local max = math.max
|
||||
local get_biome_data = minetest.get_biome_data
|
||||
local new_vector = vector.new
|
||||
local math_random = math.random
|
||||
local get_biome_name = minetest.get_biome_name
|
||||
local max = math.max
|
||||
local get_objects_inside_radius = minetest.get_objects_inside_radius
|
||||
local vector_distance = vector.distance
|
||||
local vector_distance = vector.distance
|
||||
|
||||
-- range for mob count
|
||||
local aoc_range = 32
|
||||
|
@ -535,7 +536,6 @@ end
|
|||
|
||||
--todo mob limiting
|
||||
--MAIN LOOP
|
||||
|
||||
if mobs_spawn then
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
|
@ -544,105 +544,80 @@ if mobs_spawn then
|
|||
timer = 0
|
||||
for _,player in pairs(minetest.get_connected_players()) do
|
||||
for i = 1,math_random(3,8) do
|
||||
repeat -- after this line each "break" means "continue"
|
||||
local player_pos = player:get_pos()
|
||||
|
||||
local _,dimension = mcl_worlds.y_to_layer(player_pos.y)
|
||||
local player_pos = player:get_pos()
|
||||
|
||||
local _,dimension = mcl_worlds.y_to_layer(player_pos.y)
|
||||
|
||||
if dimension ~= "void" and dimension ~= "default" then
|
||||
|
||||
if dimension == "void" or dimension == "default" then
|
||||
break -- ignore void and unloaded area
|
||||
end
|
||||
|
||||
local min,max = decypher_limits(player_pos.y)
|
||||
|
||||
local goal_pos = position_calculation(player_pos)
|
||||
|
||||
|
||||
local spawning_position_list = find_nodes_in_area_under_air(new_vector(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"})
|
||||
|
||||
--couldn't find node
|
||||
if #spawning_position_list <= 0 then
|
||||
break
|
||||
if #spawning_position_list > 0 then --couldn't find node
|
||||
local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)]
|
||||
|
||||
--Prevent strange behavior/too close to player
|
||||
if spawning_position and vector_distance(player_pos, spawning_position) > 15 then
|
||||
|
||||
local gotten_node = get_node(spawning_position).name
|
||||
|
||||
if gotten_node and gotten_node ~= "air" then --skip air nodes
|
||||
|
||||
local gotten_biome = get_biome_data(spawning_position)
|
||||
|
||||
if gotten_biome then --skip if in unloaded area
|
||||
|
||||
gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with
|
||||
|
||||
--grab random mob
|
||||
local mob_def = spawn_dictionary[math.random(1,#spawn_dictionary)]
|
||||
|
||||
if mob_def --skip if something ridiculous happens (nil mob def)
|
||||
and mob_def.dimension == dimension --skip if not correct dimension
|
||||
and biome_check(mob_def.biomes, gotten_biome) then --skip if not in correct biome
|
||||
|
||||
--add this so mobs don't spawn inside nodes
|
||||
spawning_position.y = spawning_position.y + 1
|
||||
|
||||
if spawning_position.y >= mob_def.min_height and spawning_position.y <= mob_def.max_height then
|
||||
|
||||
--only need to poll for node light if everything else worked
|
||||
local gotten_light = get_node_light(spawning_position)
|
||||
|
||||
--don't spawn if not in light limits
|
||||
if gotten_light >= mob_def.min_light and gotten_light <= mob_def.max_light then
|
||||
|
||||
local is_water = get_item_group(gotten_node, "water") ~= 0
|
||||
local is_lava = get_item_group(gotten_node, "lava") ~= 0
|
||||
|
||||
if mob_def.type_of_spawning ~= "ground" or not (is_water or is_lava) then
|
||||
|
||||
--finally do the heavy check (for now) of mobs in area
|
||||
if count_mobs(spawning_position, mob_def.spawn_class) < mob_def.aoc then
|
||||
|
||||
--adjust the position for water and lava mobs
|
||||
if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then
|
||||
spawning_position.y = spawning_position.y - 1
|
||||
end
|
||||
|
||||
--everything is correct, spawn mob
|
||||
minetest.add_entity(spawning_position, mob_def.name)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)]
|
||||
|
||||
--Prevent strange behavior/too close to player
|
||||
if not spawning_position or vector_distance(player_pos, spawning_position) < 15 then
|
||||
break
|
||||
end
|
||||
|
||||
local gotten_node = get_node(spawning_position).name
|
||||
|
||||
if not gotten_node or gotten_node == "air" then --skip air nodes
|
||||
break
|
||||
end
|
||||
|
||||
local gotten_biome = minetest.get_biome_data(spawning_position)
|
||||
|
||||
if not gotten_biome then
|
||||
break --skip if in unloaded area
|
||||
end
|
||||
|
||||
gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with
|
||||
|
||||
--grab random mob
|
||||
local mob_def = spawn_dictionary[math.random(1,#spawn_dictionary)]
|
||||
|
||||
if not mob_def then
|
||||
break --skip if something ridiculous happens (nil mob def)
|
||||
end
|
||||
|
||||
--skip if not correct dimension
|
||||
if mob_def.dimension ~= dimension then
|
||||
break
|
||||
end
|
||||
|
||||
--skip if not in correct biome
|
||||
if not biome_check(mob_def.biomes, gotten_biome) then
|
||||
break
|
||||
end
|
||||
|
||||
--add this so mobs don't spawn inside nodes
|
||||
spawning_position.y = spawning_position.y + 1
|
||||
|
||||
if spawning_position.y < mob_def.min_height or spawning_position.y > mob_def.max_height then
|
||||
break
|
||||
end
|
||||
|
||||
--only need to poll for node light if everything else worked
|
||||
local gotten_light = get_node_light(spawning_position)
|
||||
|
||||
--don't spawn if not in light limits
|
||||
if gotten_light < mob_def.min_light or gotten_light > mob_def.max_light then
|
||||
break
|
||||
end
|
||||
|
||||
local is_water = get_item_group(gotten_node, "water") ~= 0
|
||||
local is_lava = get_item_group(gotten_node, "lava") ~= 0
|
||||
|
||||
if mob_def.type_of_spawning == "ground" and is_water then
|
||||
break
|
||||
end
|
||||
|
||||
if mob_def.type_of_spawning == "ground" and is_lava then
|
||||
break
|
||||
end
|
||||
|
||||
--finally do the heavy check (for now) of mobs in area
|
||||
if count_mobs(spawning_position, mob_def.spawn_class) >= mob_def.aoc then
|
||||
break
|
||||
end
|
||||
|
||||
--adjust the position for water and lava mobs
|
||||
if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then
|
||||
spawning_position.y = spawning_position.y - 1
|
||||
end
|
||||
|
||||
--everything is correct, spawn mob
|
||||
minetest.add_entity(spawning_position, mob_def.name)
|
||||
until true --this is a safety catch
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
|
|
@ -364,10 +364,10 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
else -- I'm not sure what this part does, but I don't want to break anything - jordan4ibanez
|
||||
if self.provoked == "staring" then
|
||||
self.provoked = "broke_contact"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -7,7 +7,6 @@ local is_in_void = mcl_worlds.is_in_void
|
|||
local get_spawn_pos = mcl_spawn.get_player_spawn_pos
|
||||
local death_msg = mcl_death_messages.player_damage
|
||||
local send_chat = minetest.chat_send_player
|
||||
local get_connected = minetest.get_connected_players
|
||||
|
||||
local voidtimer = 0
|
||||
local VOID_DAMAGE_FREQ = 0.5
|
||||
|
@ -54,37 +53,37 @@ minetest.register_on_mods_loaded(function()
|
|||
end)
|
||||
|
||||
-- Hurt players or teleport them back to spawn if they are too deep in the void
|
||||
minetest.register_globalstep(function(dtime)
|
||||
voidtimer = voidtimer + dtime
|
||||
if voidtimer > VOID_DAMAGE_FREQ then
|
||||
voidtimer = 0
|
||||
local enable_damage = minetest.settings:get_bool("enable_damage")
|
||||
local players = get_connected()
|
||||
for p=1, #players do
|
||||
local player = players[p]
|
||||
local pos = player:get_pos()
|
||||
local void, void_deadly = is_in_void(pos)
|
||||
if void_deadly then
|
||||
local immortal_val = player:get_armor_groups().immortal
|
||||
local is_immortal = false
|
||||
if immortal_val and immortal_val > 0 then
|
||||
is_immortal = true
|
||||
end
|
||||
if is_immortal or not enable_damage then
|
||||
-- If damage is disabled, we can't kill players.
|
||||
-- So we just teleport the player back to spawn.
|
||||
local spawn = get_spawn_pos(player)
|
||||
player:set_pos(spawn)
|
||||
dim_change(player, pos_to_dim(spawn))
|
||||
send_chat(player:get_player_name(), S("The void is off-limits to you!"))
|
||||
elseif enable_damage and not is_immortal then
|
||||
-- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds)
|
||||
if player:get_hp() > 0 then
|
||||
death_msg(player, S("@1 fell into the endless void.", player:get_player_name()))
|
||||
player:set_hp(player:get_hp() - VOID_DAMAGE)
|
||||
end
|
||||
mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
voidtimer = voidtimer + dtime
|
||||
if voidtimer > VOID_DAMAGE_FREQ then
|
||||
voidtimer = 0
|
||||
return true
|
||||
end
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
local pos = player:get_pos()
|
||||
local void, void_deadly = is_in_void(pos)
|
||||
if void_deadly then
|
||||
local immortal_val = player:get_armor_groups().immortal
|
||||
local is_immortal = false
|
||||
if immortal_val and immortal_val > 0 then
|
||||
is_immortal = true
|
||||
end
|
||||
if is_immortal or not enable_damage then
|
||||
-- If damage is disabled, we can't kill players.
|
||||
-- So we just teleport the player back to spawn.
|
||||
local spawn = get_spawn_pos(player)
|
||||
player:set_pos(spawn)
|
||||
dim_change(player, pos_to_dim(spawn))
|
||||
send_chat(player:get_player_name(), S("The void is off-limits to you!"))
|
||||
elseif enable_damage and not is_immortal then
|
||||
-- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds)
|
||||
if player:get_hp() > 0 then
|
||||
death_msg(player, S("@1 fell into the endless void.", player:get_player_name()))
|
||||
player:set_hp(player:get_hp() - VOID_DAMAGE)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end,
|
||||
})
|
|
@ -1,6 +1,8 @@
|
|||
local S = minetest.get_translator("doc_items")
|
||||
local N = function(s) return s end
|
||||
|
||||
local math = math
|
||||
|
||||
doc.sub.items = {}
|
||||
|
||||
-- Template texts
|
||||
|
@ -1397,16 +1399,18 @@ TODO: If possible, try to replace this functionality by updating the revealed it
|
|||
soon the player obtained a new item (probably needs new Minetest callbacks). ]]
|
||||
local checktime = 8
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer > checktime then
|
||||
local players = minetest.get_connected_players()
|
||||
for p=1, #players do
|
||||
reveal_items_in_inventory(players[p])
|
||||
end
|
||||
|
||||
mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer > checktime then return true end
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
reveal_items_in_inventory(player)
|
||||
end,
|
||||
after_execute = function(dtime)
|
||||
timer = math.fmod(timer, checktime)
|
||||
end
|
||||
end)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_on_mods_loaded(gather_descs)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = doc_items
|
||||
author = Wuzzy
|
||||
description = Adds automatically generated help texts for items.
|
||||
depends = doc
|
||||
depends = doc, mcl_util
|
||||
|
|
|
@ -112,7 +112,7 @@ end)
|
|||
|
||||
local main_timer = 0
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
--[[minetest.register_globalstep(function(dtime)
|
||||
main_timer = main_timer + dtime
|
||||
timer = timer + dtime
|
||||
if main_timer > mcl_hbarmor.tick or timer > 4 then
|
||||
|
@ -132,4 +132,29 @@ minetest.register_globalstep(function(dtime)
|
|||
end
|
||||
end
|
||||
if timer > 4 then timer = 0 end
|
||||
end)
|
||||
end)]]
|
||||
|
||||
mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
main_timer = main_timer + dtime
|
||||
timer = timer + dtime
|
||||
if main_timer > mcl_hbarmor.tick or timer > 4 then
|
||||
if minetest.settings:get_bool("enable_damage") then
|
||||
if main_timer > mcl_hbarmor.tick then main_timer = 0 end
|
||||
return true
|
||||
end
|
||||
end
|
||||
if timer > 4 then timer = 0 end
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
local name = player:get_player_name()
|
||||
if mcl_hbarmor.player_active[name] == true then
|
||||
local ret = mcl_hbarmor.get_armor(player)
|
||||
if ret == false then
|
||||
minetest.log("error", "[mcl_hbarmor] Call to mcl_hbarmor.get_armor in globalstep returned with false!")
|
||||
end
|
||||
-- update all hud elements
|
||||
update_hud(player)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = mcl_hbarmor
|
||||
author = BlockMen
|
||||
description = Adds a HUD bar displaying the current damage of the player's armor.
|
||||
depends = hudbars, mcl_armor
|
||||
depends = hudbars, mcl_armor, mcl_util
|
||||
|
|
|
@ -64,13 +64,12 @@ minetest.register_on_leaveplayer(function(player)
|
|||
wieldindex[name] = nil
|
||||
end)
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
mcl_util.register_player_globalstep({
|
||||
execute = function(player, dtime)
|
||||
local player_name = player:get_player_name()
|
||||
local wstack = player:get_wielded_item()
|
||||
local wname = wstack:get_name()
|
||||
local windex = player:get_wield_index()
|
||||
|
||||
if dtimes[player_name] and dtimes[player_name] < dlimit then
|
||||
dtimes[player_name] = dtimes[player_name] + dtime
|
||||
if dtimes[player_name] > dlimit and huds[player_name] then
|
||||
|
@ -83,12 +82,9 @@ minetest.register_globalstep(function(dtime)
|
|||
wieldindex[player_name] = windex
|
||||
wield[player_name] = wname
|
||||
dtimes[player_name] = 0
|
||||
|
||||
if huds[player_name] then
|
||||
|
||||
local def = minetest.registered_items[wname]
|
||||
local meta = wstack:get_meta()
|
||||
|
||||
--[[ Get description. Order of preference:
|
||||
* description from metadata
|
||||
* description from item definition
|
||||
|
@ -108,6 +104,5 @@ minetest.register_globalstep(function(dtime)
|
|||
player:hud_change(huds[player_name], 'text', desc)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
end,
|
||||
})
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
name = show_wielded_item
|
||||
author = 4aiman
|
||||
description = Displays the name of the wielded item.
|
||||
depends = mcl_util
|
||||
optional_depends = hudbars
|
||||
|
|
|
@ -340,17 +340,15 @@ controls.register_on_hold(function(player, key, time)
|
|||
end
|
||||
end)
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
mcl_util.register_player_globalstep({
|
||||
execute = function(player, dtime)
|
||||
local name = player:get_player_name()
|
||||
local wielditem = player:get_wielded_item()
|
||||
local wieldindex = player:get_wield_index()
|
||||
local controls = player:get_player_control()
|
||||
if type(bow_load[name]) == "number" and ((wielditem:get_name()~="mcl_bows:bow_0" and wielditem:get_name()~="mcl_bows:bow_1" and wielditem:get_name()~="mcl_bows:bow_2" and wielditem:get_name()~="mcl_bows:bow_0_enchanted" and wielditem:get_name()~="mcl_bows:bow_1_enchanted" and wielditem:get_name()~="mcl_bows:bow_2_enchanted") or wieldindex ~= bow_index[name]) then
|
||||
if type(bow_load[name]) == "number" and ((wielditem:get_name()~="mcl_bows:bow_0" and wielditem:get_name()~="mcl_bows:bow_1" and wielditem:get_name()~="mcl_bows:bow_2" and wielditem:get_name()~="mcl_bows:bow_0_enchanted" and wielditem:get_name()~="mcl_bows:bow_1_enchanted" and wielditem:get_name()~="mcl_bows:bow_2_enchanted") or player:get_wield_index() ~= bow_index[name]) then
|
||||
reset_bow_state(player, true)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
reset_bows(player)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
name = mcl_bows
|
||||
author = Arcelmi
|
||||
description = This mod adds bows and arrows for MineClone 2.
|
||||
depends = controls, mcl_particles, mcl_enchanting, mcl_init
|
||||
depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_util
|
||||
optional_depends = awards, mcl_achievements, mcl_core, mcl_mobitems, playerphysics, doc, doc_identifier, mesecons_button
|
||||
|
||||
|
|
|
@ -76,25 +76,26 @@ end
|
|||
-- This timer makes sure the clocks get updated from time to time regardless of time_speed,
|
||||
-- just in case some clocks in the world go wrong
|
||||
local force_clock_update_timer = 0
|
||||
local now
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
local now = watch.get_clock_frame()
|
||||
force_clock_update_timer = force_clock_update_timer + dtime
|
||||
random_timer = random_timer + dtime
|
||||
-- This causes the random spinning of the clock
|
||||
if random_timer >= random_timer_trigger then
|
||||
random_frame = (random_frame + math.random(-4, 4)) % clock_frames
|
||||
random_timer = 0
|
||||
end
|
||||
|
||||
if watch.old_time == now and force_clock_update_timer < 60 then
|
||||
return
|
||||
end
|
||||
force_clock_update_timer = 0
|
||||
|
||||
watch.old_time = now
|
||||
|
||||
for p, player in pairs(minetest.get_connected_players()) do
|
||||
mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
now = watch.get_clock_frame()
|
||||
force_clock_update_timer = force_clock_update_timer + dtime
|
||||
random_timer = random_timer + dtime
|
||||
-- This causes the random spinning of the clock
|
||||
if random_timer >= random_timer_trigger then
|
||||
random_frame = (random_frame + math.random(-4, 4)) % clock_frames
|
||||
random_timer = 0
|
||||
end
|
||||
if watch.old_time == now and force_clock_update_timer < 60 then
|
||||
return
|
||||
end
|
||||
force_clock_update_timer = 0
|
||||
watch.old_time = now
|
||||
return true
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
for s, stack in pairs(player:get_inventory():get_list("main")) do
|
||||
local dim = mcl_worlds.pos_to_dimension(player:get_pos())
|
||||
local frame
|
||||
|
@ -111,8 +112,8 @@ minetest.register_globalstep(function(dtime)
|
|||
player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..frame.." "..count)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end,
|
||||
})
|
||||
|
||||
-- Immediately set correct clock time after crafting
|
||||
minetest.register_on_craft(function(itemstack)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = mcl_clock
|
||||
description = A fantasy clock item roughly shows the time of day.
|
||||
depends = mcl_init, mcl_worlds, mesecons
|
||||
depends = mcl_init, mcl_worlds, mesecons, mcl_util
|
||||
optional_depends = doc
|
||||
|
|
|
@ -12,22 +12,27 @@ local random_timer_trigger = 0.5 -- random compass spinning tick in seconds. Inc
|
|||
|
||||
local random_frame = math.random(0, compass_frames-1)
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
random_timer = random_timer + dtime
|
||||
local math = math
|
||||
|
||||
if random_timer >= random_timer_trigger then
|
||||
random_frame = (random_frame + math.random(-1, 1)) % compass_frames
|
||||
random_timer = 0
|
||||
end
|
||||
for i,player in pairs(minetest.get_connected_players()) do
|
||||
local function has_compass(player)
|
||||
for _,stack in pairs(player:get_inventory():get_list("main")) do
|
||||
if minetest.get_item_group(stack:get_name(), "compass") ~= 0 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
local function has_compass(player)
|
||||
for _,stack in pairs(player:get_inventory():get_list("main")) do
|
||||
if minetest.get_item_group(stack:get_name(), "compass") ~= 0 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
random_timer = random_timer + dtime
|
||||
if random_timer >= random_timer_trigger then
|
||||
random_frame = (random_frame + math.random(-1, 1)) % compass_frames
|
||||
random_timer = 0
|
||||
end
|
||||
return true
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
if has_compass(player) then
|
||||
local pos = player:get_pos()
|
||||
local dim = mcl_worlds.pos_to_dimension(pos)
|
||||
|
@ -61,8 +66,8 @@ minetest.register_globalstep(function(dtime)
|
|||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end,
|
||||
})
|
||||
|
||||
local images = {}
|
||||
for frame = 0, compass_frames-1 do
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = mcl_compass
|
||||
description = A compass item which points towards the world origin.
|
||||
depends = mcl_core, mcl_worlds, mesecons
|
||||
depends = mcl_core, mcl_worlds, mesecons, mcl_util
|
||||
optional_depends = doc
|
||||
|
|
|
@ -19,7 +19,7 @@ local find_nodes_in_area = minetest.find_nodes_in_area
|
|||
local find_node_near = minetest.find_node_near
|
||||
local get_item_group = minetest.get_item_group
|
||||
|
||||
local get_connected_players = minetest.get_connected_players
|
||||
--local get_connected_players = minetest.get_connected_players
|
||||
|
||||
local vector = vector
|
||||
local math = math
|
||||
|
@ -463,7 +463,7 @@ if flame_sound then
|
|||
|
||||
-- Cycle for updating players sounds
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
--[[minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer < cycle then
|
||||
return
|
||||
|
@ -474,7 +474,21 @@ if flame_sound then
|
|||
for n = 1, #players do
|
||||
mcl_fire.update_player_sound(players[n])
|
||||
end
|
||||
end)
|
||||
end)]]
|
||||
|
||||
mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer < cycle then
|
||||
return false
|
||||
end
|
||||
timer = 0
|
||||
return true
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
mcl_fire.update_player_sound(player)
|
||||
end,
|
||||
})
|
||||
|
||||
-- Stop sound and clear handle on player leave
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
name = mcl_fire
|
||||
depends = mcl_core, mcl_worlds, mcl_sounds, mcl_particles
|
||||
depends = mcl_core, mcl_worlds, mcl_sounds, mcl_particles, mcl_util
|
||||
optional_depends = mcl_portals
|
|
@ -97,14 +97,16 @@ end)
|
|||
|
||||
local updatetimer = 0
|
||||
if not minetest.is_creative_enabled("") then
|
||||
minetest.register_globalstep(function(dtime)
|
||||
updatetimer = updatetimer + dtime
|
||||
if updatetimer > 0.1 then
|
||||
local players = minetest.get_connected_players()
|
||||
for i=1, #players do
|
||||
update_minimap(players[i])
|
||||
end
|
||||
mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
updatetimer = updatetimer + dtime
|
||||
if updatetimer > 0.1 then return true else return false end
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
update_minimap(player)
|
||||
end,
|
||||
after_execute = function(dtime)
|
||||
updatetimer = updatetimer - dtime
|
||||
end
|
||||
end)
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
name = mcl_maps
|
||||
depends = mcl_wip
|
||||
depends = mcl_wip, mcl_util
|
||||
|
|
|
@ -181,6 +181,54 @@ minetest.register_globalstep(function(dtime)
|
|||
end
|
||||
end)
|
||||
|
||||
--[[mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
main_timer = main_timer + dtime
|
||||
timer = timer + dtime
|
||||
if main_timer > mcl_hunger.HUD_TICK or timer > 0.5 then
|
||||
if main_timer > mcl_hunger.HUD_TICK then main_timer = 0 end
|
||||
return true
|
||||
end
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
local name = player:get_player_name()
|
||||
local h = tonumber(mcl_hunger.get_hunger(player))
|
||||
local hp = player:get_hp()
|
||||
if timer > 0.5 then
|
||||
-- Slow health regeneration, and hunger damage (every 4s).
|
||||
-- Regeneration rate based on tutorial video <https://www.youtube.com/watch?v=zs2t-xCVHBo>.
|
||||
-- Minecraft Wiki seems to be wrong in claiming that full hunger gives 0.5s regen rate.
|
||||
if timerMult == 0 then
|
||||
if h >= 18 and hp > 0 and hp < 20 then
|
||||
-- +1 HP, +exhaustion
|
||||
player:set_hp(hp+1)
|
||||
mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_REGEN)
|
||||
mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player))
|
||||
elseif h == 0 then
|
||||
-- Damage hungry player down to 1 HP
|
||||
-- TODO: Allow starvation at higher difficulty levels
|
||||
if hp-1 > 0 then
|
||||
if mod_death_messages then
|
||||
mcl_death_messages.player_damage(player, S("@1 starved to death.", name))
|
||||
end
|
||||
player:set_hp(hp-1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end,
|
||||
after_execute = function(dtime)
|
||||
if timer > 0.5 then
|
||||
timer = 0
|
||||
timerMult = timerMult + 1
|
||||
if timerMult > 7 then
|
||||
timerMult = 0
|
||||
end
|
||||
end
|
||||
end,
|
||||
})]]
|
||||
|
||||
--[[ IF HUNGER IS NOT ENABLED ]]
|
||||
else
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name = mcl_hunger
|
||||
author = BlockMen
|
||||
description = Adds a simple hunger meachanic with satiation, food poisoning and different healing.
|
||||
depends = hudbars
|
||||
depends = hudbars, mcl_util
|
||||
optional_depends = mcl_death_messages
|
||||
|
|
|
@ -147,8 +147,8 @@ local player_set_animation = mcl_player.player_set_animation
|
|||
local player_attached = mcl_player.player_attached
|
||||
|
||||
-- Check each player and apply animations
|
||||
minetest.register_globalstep(function(dtime)
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
mcl_util.register_player_globalstep({
|
||||
execute = function(player, dtime)
|
||||
local name = player:get_player_name()
|
||||
local model_name = player_model[name]
|
||||
local model = model_name and models[model_name]
|
||||
|
@ -166,9 +166,7 @@ minetest.register_globalstep(function(dtime)
|
|||
if controls.sneak then
|
||||
animation_speed_mod = animation_speed_mod / 2
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
-- ask if player is swiming
|
||||
local head_in_water = minetest.get_item_group(mcl_playerinfo[name].node_head, "water") ~= 0
|
||||
-- ask if player is sprinting
|
||||
|
@ -217,8 +215,8 @@ minetest.register_globalstep(function(dtime)
|
|||
player_set_animation(player, "sneak_stand", animation_speed_mod)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end,
|
||||
})
|
||||
|
||||
-- Don't change HP if the player falls in the water or through End Portal:
|
||||
minetest.register_on_player_hpchange(function(player, hp_change, reason)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
name = mcl_player
|
||||
author = celeron55
|
||||
depends = mcl_util
|
||||
description = Adds the 3D player model, taken from Minetest Game 0.4.16.
|
||||
|
|
|
@ -39,37 +39,51 @@ local get_player_nodes = function(player_pos)
|
|||
end
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
|
||||
time = time + dtime
|
||||
|
||||
-- Run the rest of the code every 0.5 seconds
|
||||
if time < 0.5 then
|
||||
return
|
||||
end
|
||||
|
||||
-- reset time for next check
|
||||
-- FIXME: Make sure a regular check interval applies
|
||||
time = 0
|
||||
|
||||
-- check players
|
||||
for _,player in pairs(minetest.get_connected_players()) do
|
||||
-- who am I?
|
||||
local name = player:get_player_name()
|
||||
|
||||
-- where am I?
|
||||
local pos = player:get_pos()
|
||||
|
||||
-- what is around me?
|
||||
local node_stand, node_stand_below, node_head, node_feet = get_player_nodes(pos)
|
||||
mcl_playerinfo[name].node_stand = node_stand
|
||||
mcl_playerinfo[name].node_stand_below = node_stand_below
|
||||
mcl_playerinfo[name].node_head = node_head
|
||||
mcl_playerinfo[name].node_feet = node_feet
|
||||
|
||||
end
|
||||
|
||||
end)
|
||||
|
||||
--[[mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime)
|
||||
time = time + dtime
|
||||
if time < 0.5 then
|
||||
return false
|
||||
end
|
||||
-- reset time for next check
|
||||
-- FIXME: Make sure a regular check interval applies
|
||||
time = 0
|
||||
return true
|
||||
end,
|
||||
execute = function(player, dtime)
|
||||
local name = player:get_player_name()
|
||||
local pos = player:get_pos()
|
||||
local node_stand, node_stand_below, node_head, node_feet = get_player_nodes(pos)
|
||||
mcl_playerinfo[name].node_stand = node_stand
|
||||
mcl_playerinfo[name].node_stand_below = node_stand_below
|
||||
mcl_playerinfo[name].node_head = node_head
|
||||
mcl_playerinfo[name].node_feet = node_feet
|
||||
end,
|
||||
})]]
|
||||
|
||||
-- set to blank on join (for 3rd party mods)
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = mcl_playerinfo
|
||||
author = TenPlus1
|
||||
description = This is a helper mod for other mod to query the nodes around the player.
|
||||
depends = mcl_init, mcl_core, mcl_particles, mcl_death_messages
|
||||
depends = mcl_init, mcl_core, mcl_particles, mcl_death_messages, mcl_util
|
||||
|
|
|
@ -46,7 +46,7 @@ local player_collision = function(player)
|
|||
end
|
||||
end
|
||||
|
||||
return({x,z})
|
||||
return({x * 5,z * 5})
|
||||
end
|
||||
|
||||
-- converts yaw to degrees
|
||||
|
@ -119,37 +119,6 @@ end
|
|||
|
||||
local pitch, name, node_stand, node_stand_below, node_head, node_feet, pos
|
||||
|
||||
|
||||
minetest.register_on_punchplayer(function(player, hitter, damage)
|
||||
if hitter:is_player() then
|
||||
if hitter:get_player_control().aux1 then
|
||||
player:add_velocity(hitter:get_velocity())
|
||||
end
|
||||
if hitter:get_velocity().y < -6 then
|
||||
player:set_hp(player:get_hp() - (damage * math.random(0.50 , 0.75)))
|
||||
local pos = player:get_pos()
|
||||
minetest.add_particlespawner({
|
||||
amount = 15,
|
||||
time = 0.1,
|
||||
minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5},
|
||||
maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5},
|
||||
minvel = {x=-0.1, y=-0.1, z=-0.1},
|
||||
maxvel = {x=0.1, y=0.1, z=0.1},
|
||||
minacc = {x=0, y=0, z=0},
|
||||
maxacc = {x=0, y=0, z=0},
|
||||
minexptime = 1,
|
||||
maxexptime = 2,
|
||||
minsize = 1.5,
|
||||
maxsize = 1.5,
|
||||
collisiondetection = false,
|
||||
vertical = false,
|
||||
texture = "mcl_particles_crit.png^[colorize:#bc7a57:127",
|
||||
})
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
|
||||
time = time + dtime
|
||||
|
@ -210,26 +179,26 @@ minetest.register_globalstep(function(dtime)
|
|||
|
||||
if parent then
|
||||
local parent_yaw = degrees(parent:get_yaw())
|
||||
player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }})
|
||||
player:set_properties({collisionbox = {-0.35,0,-0.35,0.35,1.8,0.35}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }})
|
||||
player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch, -limit_vel_yaw(yaw, parent_yaw) + parent_yaw, 0))
|
||||
player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0,0,0))
|
||||
elseif controls.sneak then
|
||||
-- controls head pitch when sneaking
|
||||
player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+36,0,0))
|
||||
-- sets eye height, and nametag color accordingly
|
||||
player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 0, g = 225 }})
|
||||
player:set_properties({collisionbox = {-0.35,0,-0.35,0.35,1.8,0.35}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 0, g = 225 }})
|
||||
-- sneaking body conrols
|
||||
player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0,0,0))
|
||||
elseif get_item_group(mcl_playerinfo[name].node_head, "water") ~= 0 and is_sprinting(name) == true then
|
||||
-- set head pitch and yaw when swimming
|
||||
player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+90-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0))
|
||||
-- sets eye height, and nametag color accordingly
|
||||
player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,0.8,0.312}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }})
|
||||
player:set_properties({collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }})
|
||||
-- control body bone when swimming
|
||||
player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(degrees(dir_to_pitch(player_velocity)) - 90,-player_vel_yaw + yaw + 180,0))
|
||||
else
|
||||
-- sets eye height, and nametag color accordingly
|
||||
player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }})
|
||||
player:set_properties({collisionbox = {-0.35,0,-0.35,0.35,1.8,0.35}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }})
|
||||
|
||||
player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, 0))
|
||||
player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0, -player_vel_yaw + yaw, 0))
|
||||
|
|
|
@ -81,11 +81,18 @@ minetest.register_on_joinplayer(function(player)
|
|||
end, player)
|
||||
end)
|
||||
|
||||
minetest.register_globalstep(function()
|
||||
--[[minetest.register_globalstep(function()
|
||||
for _,player in pairs(minetest.get_connected_players()) do
|
||||
wieldview:update_wielded_item(player)
|
||||
end
|
||||
end)
|
||||
end)]]
|
||||
|
||||
mcl_util.register_player_globalstep({
|
||||
can_execute = function(dtime) return true end,
|
||||
execute = function(player, dtime)
|
||||
wieldview:update_wielded_item(player)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_entity("wieldview:wieldnode", {
|
||||
initial_properties = {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name = wieldview
|
||||
author = stujones11
|
||||
description = Makes hand wielded items visible to other players.
|
||||
depends = mcl_armor
|
||||
depends = mcl_armor, mcl_util
|
||||
|
||||
|
|
Loading…
Reference in New Issue