From 66f132a645bee3be6913a7ccb0b407b06078462f Mon Sep 17 00:00:00 2001 From: cora Date: Mon, 24 May 2021 12:41:16 +0200 Subject: [PATCH 01/38] fix crash on creeper explosion ( #1755 ) --- .../mcl_mobs/api/mob_functions/movement.lua | 53 ++++++++++--------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 9a5fd9ea1..04e3e370c 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -22,7 +22,7 @@ local DEFAULT_CLIMB_SPEED = 3 mobs.stick_in_cobweb = function(self) local current_velocity = self.object:get_velocity() - + local goal_velocity = vector_multiply(vector_normalize(current_velocity), 0.4) goal_velocity.y = -0.5 @@ -38,8 +38,11 @@ end --this is a generic float function mobs.float = function(self) - if self.object:get_acceleration().y ~= 0 then + local acceleration = self.object:get_acceleration() + if acceleration and acceleration.y ~= 0 then self.object:set_acceleration(vector_new(0,0,0)) + else + return end local current_velocity = self.object:get_velocity() @@ -86,10 +89,10 @@ end --[[ - _ _ + _ _ | | | | | | __ _ _ __ __| | -| | / _` | '_ \ / _` | +| | / _` | '_ \ / _` | | |___| (_| | | | | (_| | \_____/\__,_|_| |_|\__,_| ]] @@ -100,7 +103,7 @@ end --internal = lua (self.yaw) --engine = c++ (self.object:get_yaw()) mobs.set_velocity = function(self, v) - + local yaw = (self.yaw or 0) local current_velocity = self.object:get_velocity() @@ -152,7 +155,7 @@ mobs.jump = function(self, velocity) --fallback velocity to allow modularity velocity = velocity or DEFAULT_JUMP_HEIGHT - self.object:add_velocity(vector_new(0,velocity,0)) + self.object:add_velocity(vector_new(0,velocity,0)) end --make mobs fall slowly @@ -188,10 +191,10 @@ end --[[ - _____ _ -/ ___| (_) -\ `--.__ ___ _ __ ___ - `--. \ \ /\ / / | '_ ` _ \ + _____ _ +/ ___| (_) +\ `--.__ ___ _ __ ___ + `--. \ \ /\ / / | '_ ` _ \ /\__/ /\ V V /| | | | | | | \____/ \_/\_/ |_|_| |_| |_| ]]-- @@ -221,7 +224,7 @@ mobs.flop = function(self, velocity) local final_additional_force = vector_multiply(minetest_yaw_to_dir(dir), force) --place in the "flop" velocity to make the mob flop - final_additional_force.y = velocity + final_additional_force.y = velocity self.object:add_velocity(final_additional_force) @@ -235,7 +238,7 @@ end --internal = lua (self.yaw) --engine = c++ (self.object:get_yaw()) mobs.set_swim_velocity = function(self, v) - + local yaw = (self.yaw or 0) local pitch = (self.pitch or 0) @@ -265,14 +268,14 @@ mobs.set_swim_velocity = function(self, v) end --[[ -______ _ -| ___| | -| |_ | |_ _ +______ _ +| ___| | +| |_ | |_ _ | _| | | | | | | | | | |_| | \_| |_|\__, | __/ | - |___/ + |___/ ]]-- -- move mob in facing direction @@ -280,7 +283,7 @@ ______ _ --internal = lua (self.yaw) --engine = c++ (self.object:get_yaw()) mobs.set_fly_velocity = function(self, v) - + local yaw = (self.yaw or 0) local pitch = (self.pitch or 0) @@ -332,14 +335,14 @@ end --[[ - ___ - |_ | - | |_ _ _ __ ___ _ __ - | | | | | '_ ` _ \| '_ \ + ___ + |_ | + | |_ _ _ __ ___ _ __ + | | | | | '_ ` _ \| '_ \ /\__/ / |_| | | | | | | |_) | -\____/ \__,_|_| |_| |_| .__/ - | | - |_| +\____/ \__,_|_| |_| |_| .__/ + | | + |_| ]]-- --special mob jump movement @@ -388,4 +391,4 @@ mobs.swap_auto_step_height_adjust = function(self) elseif y_vel ~= 0 and self.stepheight ~= 0 then self.stepheight = 0 end -end \ No newline at end of file +end From f76b66eec6e596cab2ecaf310c8e2dd6d6820cf1 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:37:02 +0200 Subject: [PATCH 02/38] [mcl_mobs] fix some warnings (131 remaining!) --- .luacheckrc | 3 + mods/ENTITIES/mcl_mobs/api/api.lua | 16 +- .../mcl_mobs/api/mob_functions/ai.lua | 221 +++++++----------- .../mcl_mobs/api/mob_functions/animation.lua | 20 +- .../attack_type_instructions.lua | 55 +++-- ...ackup_code_api.lua => backup_code_api.txt} | 74 +++--- .../mcl_mobs/api/mob_functions/breeding.lua | 53 ++--- .../mcl_mobs/api/mob_functions/collision.lua | 15 +- .../api/mob_functions/death_logic.lua | 16 +- .../api/mob_functions/environment.lua | 20 +- .../mcl_mobs/api/mob_functions/head_logic.lua | 176 +++++++------- .../api/mob_functions/interaction.lua | 51 ++-- .../api/mob_functions/mob_effects.lua | 12 +- .../mcl_mobs/api/mob_functions/movement.lua | 87 ++++--- .../mcl_mobs/api/mob_functions/set_up.lua | 10 +- mods/ENTITIES/mcl_mobs/api/mount.lua | 34 +-- mods/ENTITIES/mcl_mobs/api/spawning.lua | 10 +- 17 files changed, 387 insertions(+), 486 deletions(-) rename mods/ENTITIES/mcl_mobs/api/mob_functions/{backup_code_api.lua => backup_code_api.txt} (97%) diff --git a/.luacheckrc b/.luacheckrc index 910d73a11..9d0b8cb2a 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -47,6 +47,9 @@ read_globals = { --GENERAL "default", + --ENTITIES + "cmi", + --HUD "sfinv", "sfinv_buttons", "unified_inventory", "cmsg", "inventory_plus", } \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index d413bae72..878474cf1 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -92,13 +92,13 @@ local node_snowblock = "mcl_core:snowblock" local node_snow = "mcl_core:snow" mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt" -local mod_weather = minetest_get_modpath("mcl_weather") ~= nil -local mod_explosions = minetest_get_modpath("mcl_explosions") ~= nil -local mod_mobspawners = minetest_get_modpath("mcl_mobspawners") ~= nil -local mod_hunger = minetest_get_modpath("mcl_hunger") ~= nil -local mod_worlds = minetest_get_modpath("mcl_worlds") ~= nil -local mod_armor = minetest_get_modpath("mcl_armor") ~= nil -local mod_experience = minetest_get_modpath("mcl_experience") ~= nil +local mod_weather = minetest_get_modpath("mcl_weather") +local mod_explosions = minetest_get_modpath("mcl_explosions") +local mod_mobspawners = minetest_get_modpath("mcl_mobspawners") +local mod_hunger = minetest_get_modpath("mcl_hunger") +local mod_worlds = minetest_get_modpath("mcl_worlds") +local mod_armor = minetest_get_modpath("mcl_armor") +local mod_experience = minetest_get_modpath("mcl_experience") -- random locals I found @@ -743,7 +743,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) nametag = string.sub(nametag, 1, MAX_MOB_NAME_LENGTH) end ent.nametag = nametag - update_tag(ent) + --update_tag(ent) end -- if not in creative then take item diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index d75bda6c6..df2ccade2 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -1,12 +1,8 @@ -local math_random = math.random -local math_pi = math.pi -local math_floor = math.floor -local math_round = math.round +local math = math +local vector = vector +local string = string -local vector_multiply = vector.multiply -local vector_add = vector.add -local vector_new = vector.new -local vector_distance = vector.distance +local tonumber = tonumber local minetest_yaw_to_dir = minetest.yaw_to_dir local minetest_get_item_group = minetest.get_item_group @@ -28,16 +24,16 @@ end --a simple helper function for rounding --http://lua-users.org/wiki/SimpleRound -function round2(num, numDecimalPlaces) +local function round2(num, numDecimalPlaces) return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num)) end --[[ - _ _ + _ _ | | | | | | __ _ _ __ __| | -| | / _` | '_ \ / _` | +| | / _` | '_ \ / _` | | |___| (_| | | | | (_| | \_____/\__,_|_| |_|\__,_| ]]-- @@ -50,24 +46,23 @@ local cliff_check = function(self,dtime) end local pos = self.object:get_pos() - local dir = minetest_yaw_to_dir(self.yaw) + local dir = minetest_yaw_to_dir(self.yaw) local collisionbox = self.object:get_properties().collisionbox local radius = collisionbox[4] + 0.5 - dir = vector_multiply(dir,radius) + dir = vector.multiply(dir,radius) - local free_fall, blocker = minetest_line_of_sight( + local free_fall = minetest_line_of_sight( {x = pos.x + dir.x, y = pos.y, z = pos.z + dir.z}, {x = pos.x + dir.x, y = pos.y - self.fear_height, z = pos.z + dir.z}) return free_fall end - -- state switching logic (stand, walk, run, attacks) local land_state_list_wandering = {"stand", "walk"} -local land_state_switch = function(self, dtime) +local function land_state_switch(self, dtime) --do math before sure not attacking, following, or running away so continue --doing random walking for mobs if all states are not met @@ -93,8 +88,8 @@ local land_state_switch = function(self, dtime) end --ignore everything else if following - if mobs.check_following(self) and - (not self.breed_lookout_timer or (self.breed_lookout_timer and self.breed_lookout_timer == 0)) and + if mobs.check_following(self) and + (not self.breed_lookout_timer or (self.breed_lookout_timer and self.breed_lookout_timer == 0)) and (not self.breed_timer or (self.breed_timer and self.breed_timer == 0)) then self.state = "follow" return @@ -136,7 +131,6 @@ local land_state_execution = function(self,dtime) if not self.object:get_properties() then return end - --timer to time out looking for mate if self.breed_lookout_timer and self.breed_lookout_timer > 0 then @@ -176,12 +170,12 @@ local land_state_execution = function(self,dtime) if velocity.y < 0 then --lua is acting really weird so we have to help it if round2(self.object:get_acceleration().y, 1) == -self.gravity then - self.object:set_acceleration(vector_new(0,0,0)) + self.object:set_acceleration(vector.new(0,0,0)) mobs.mob_fall_slow(self) end else if round2(self.object:get_acceleration().y, 1) == 0 then - self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.object:set_acceleration(vector.new(0,-self.gravity,0)) end end end @@ -206,15 +200,13 @@ local land_state_execution = function(self,dtime) end mobs.lock_yaw(self) - elseif self.state == "follow" then - + elseif self.state == "follow" then --always look at players mobs.set_yaw_while_following(self) --check distance - local distance_from_follow_person = vector_distance(self.object:get_pos(), self.following_person:get_pos()) + local distance_from_follow_person = vector.distance(self.object:get_pos(), self.following_person:get_pos()) local distance_2d = mobs.get_2d_distance(self.object:get_pos(), self.following_person:get_pos()) - --don't push the player if too close --don't spin around randomly if self.follow_distance < distance_from_follow_person and self.minimum_follow_distance < distance_2d then @@ -240,7 +232,7 @@ local land_state_execution = function(self,dtime) self.walk_timer = math.random(1,6) + math.random() --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) + self.yaw = (math.random() * (math.pi * 2)) end --do animation @@ -253,15 +245,13 @@ local land_state_execution = function(self,dtime) local node_in_front_of = mobs.jump_check(self) if node_in_front_of == 1 then - mobs.jump(self) - - --turn if on the edge of cliff - --(this is written like this because unlike - --jump_check which simply tells the mob to jump - --this requires a mob to turn, removing the - --ease of a full implementation for it in a single - --function) + --turn if on the edge of cliff + --(this is written like this because unlike + --jump_check which simply tells the mob to jump + --this requires a mob to turn, removing the + --ease of a full implementation for it in a single + --function) elseif node_in_front_of == 2 or (self.fear_height ~= 0 and cliff_check(self,dtime)) then --turn 45 degrees if so quick_rotate(self,dtime) @@ -292,9 +282,7 @@ local land_state_execution = function(self,dtime) local node_in_front_of = mobs.jump_check(self) if node_in_front_of == 1 then - mobs.jump(self) - --turn if on the edge of cliff --(this is written like this because unlike --jump_check which simply tells the mob to jump @@ -342,7 +330,7 @@ local land_state_execution = function(self,dtime) mobs.set_velocity(self, self.walk_velocity) --smoosh together basically - if vector_distance(self.object:get_pos(), mate:get_pos()) <= self.breed_distance then + if vector.distance(self.object:get_pos(), mate:get_pos()) <= self.breed_distance then mobs.set_mob_animation(self, "stand") if self.special_breed_timer == 0 then self.special_breed_timer = 2 --breeding takes 2 seconds @@ -353,7 +341,7 @@ local land_state_execution = function(self,dtime) --pop a baby out, it's a miracle! local baby_pos = vector.divide(vector.add(self.object:get_pos(), mate:get_pos()), 2) - local baby_mob = minetest.add_entity(pos, self.name, minetest.serialize({baby = true, grow_up_timer = self.grow_up_goal, bred = true})) + minetest.add_entity(baby_pos, self.name, minetest.serialize({baby = true, grow_up_timer = self.grow_up_goal, bred = true})) mobs.play_sound_specific(self,"item_drop_pickup") @@ -375,14 +363,13 @@ local land_state_execution = function(self,dtime) mobs.set_velocity(self,0) end - end - + end if float_now then mobs.float(self) else local acceleration = self.object:get_acceleration() if acceleration and acceleration.y == 0 then - self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.object:set_acceleration(vector.new(0,-self.gravity,0)) end end end @@ -391,10 +378,10 @@ end --[[ - _____ _ -/ ___| (_) -\ `--.__ ___ _ __ ___ - `--. \ \ /\ / / | '_ ` _ \ + _____ _ +/ ___| (_) +\ `--.__ ___ _ __ ___ + `--. \ \ /\ / / | '_ ` _ \ /\__/ /\ V V /| | | | | | | \____/ \_/\_/ |_|_| |_| |_| ]]-- @@ -416,16 +403,16 @@ end --check if a mob needs to turn while swimming local swim_turn_check = function(self,dtime) - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local dir = minetest_yaw_to_dir(self.yaw) + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local dir = minetest_yaw_to_dir(self.yaw) - local collisionbox = self.object:get_properties().collisionbox + local collisionbox = self.object:get_properties().collisionbox local radius = collisionbox[4] + 0.5 - vector_multiply(dir, radius) + vector.multiply(dir, radius) - local test_dir = vector.add(pos,dir) + local test_dir = vector.add(pos,dir) local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 @@ -437,11 +424,11 @@ local swim_physics_swapper = function(self,inside_swim_node) --should be swimming, gravity is applied, switch to floating if inside_swim_node and self.object:get_acceleration().y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) + self.object:set_acceleration(vector.new(0,0,0)) --not be swim, gravity isn't applied, switch to falling elseif not inside_swim_node and self.object:get_acceleration().y == 0 then self.pitch = 0 - self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.object:set_acceleration(vector.new(0,-self.gravity,0)) end end @@ -482,22 +469,17 @@ local swim_state_execution = function(self,dtime) end mobs.lock_yaw(self) - elseif self.state == "swim" then - self.walk_timer = self.walk_timer - dtime - --reset the walk timer if self.walk_timer <= 0 then - --re-randomize the walk timer self.walk_timer = math.random(1,6) + math.random() - --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) + self.yaw = (math.random() * (math.pi * 2)) --create a truly random pitch, since there is no easy access to pitch math that I can find - self.pitch = math_random() * math.random(1,3) * random_pitch_multiplier[math_random(1,2)] + self.pitch = math.random() * math.random(1,3) * random_pitch_multiplier[math.random(1,2)] end --do animation @@ -535,14 +517,14 @@ end --[[ -______ _ -| ___| | -| |_ | |_ _ +______ _ +| ___| | +| |_ | |_ _ | _| | | | | | | | | | |_| | \_| |_|\__, | - __/ | - |___/ + __/ | + |___/ ]]-- -- state switching logic (stand, walk, run, attacks) @@ -566,16 +548,16 @@ end --check if a mob needs to turn while flying local fly_turn_check = function(self,dtime) - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local dir = minetest_yaw_to_dir(self.yaw) + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local dir = minetest_yaw_to_dir(self.yaw) - local collisionbox = self.object:get_properties().collisionbox + local collisionbox = self.object:get_properties().collisionbox local radius = collisionbox[4] + 0.5 - vector_multiply(dir, radius) + vector.multiply(dir, radius) - local test_dir = vector.add(pos,dir) + local test_dir = vector.add(pos,dir) local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 @@ -587,11 +569,11 @@ local fly_physics_swapper = function(self,inside_fly_node) --should be flyming, gravity is applied, switch to floating if inside_fly_node and self.object:get_acceleration().y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) + self.object:set_acceleration(vector.new(0,0,0)) --not be fly, gravity isn't applied, switch to falling elseif not inside_fly_node and self.object:get_acceleration().y == 0 then self.pitch = 0 - self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.object:set_acceleration(vector.new(0,-self.gravity,0)) end end @@ -635,15 +617,13 @@ local fly_state_execution = function(self,dtime) --reset the walk timer if self.walk_timer <= 0 then - --re-randomize the walk timer self.walk_timer = math.random(1,6) + math.random() - --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) + self.yaw = (math.random() * (math.pi * 2)) --create a truly random pitch, since there is no easy access to pitch math that I can find - self.pitch = math_random() * math.random(1,3) * random_pitch_multiplier[math_random(1,2)] + self.pitch = math.random() * math.random(1,3) * random_pitch_multiplier[math.random(1,2)] end --do animation @@ -663,9 +643,7 @@ local fly_state_execution = function(self,dtime) --enable rotation locking mobs.movement_rotation_lock(self) - elseif self.state == "attack" then - --execute mob attack type --if self.attack_type == "explode" then @@ -697,40 +675,39 @@ end --[[ - ___ - |_ | - | |_ _ _ __ ___ _ __ - | | | | | '_ ` _ \| '_ \ + ___ + |_ | + | |_ _ _ __ ___ _ __ + | | | | | '_ ` _ \| '_ \ /\__/ / |_| | | | | | | |_) | -\____/ \__,_|_| |_| |_| .__/ - | | - |_| +\____/ \__,_|_| |_| |_| .__/ + | | + |_| ]]-- --check if a mob needs to turn while jumping -local jump_turn_check = function(self,dtime) +--[[local function jump_turn_check(self, dtime) + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local dir = minetest_yaw_to_dir(self.yaw) - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local dir = minetest_yaw_to_dir(self.yaw) - - local collisionbox = self.object:get_properties().collisionbox + local collisionbox = self.object:get_properties().collisionbox local radius = collisionbox[4] + 0.5 - vector_multiply(dir, radius) + vector.multiply(dir, radius) - local test_dir = vector.add(pos,dir) + local test_dir = vector.add(pos,dir) local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - return(green_flag_1) -end + return green_flag_1 +end]] -- state switching logic (stand, jump, run, attacks) local jump_state_list_wandering = {"stand", "jump"} -local jump_state_switch = function(self, dtime) +local function jump_state_switch(self, dtime) self.state_timer = self.state_timer - dtime if self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() @@ -739,8 +716,8 @@ local jump_state_switch = function(self, dtime) end -- states are executed here -local jump_state_execution = function(self,dtime) - +local function jump_state_execution(self, dtime) + local node_in_front_of = mobs.jump_check(self) local pos = self.object:get_pos() local collisionbox = self.object:get_properties().collisionbox --get the center of the mob @@ -775,7 +752,7 @@ local jump_state_execution = function(self,dtime) self.walk_timer = math.random(1,6) + math.random() --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) + self.yaw = (math.random() * (math.pi * 2)) end --do animation @@ -793,15 +770,10 @@ local jump_state_execution = function(self,dtime) mobs.jump_move(self,self.walk_velocity) elseif self.state == "run" then - print("run") - elseif self.state == "attack" then - print("attack") - - end - + end if float_now then mobs.float(self) end @@ -811,14 +783,14 @@ end --[[ -___ ___ _ _ _ -| \/ | (_) | | (_) -| . . | __ _ _ _ __ | | ___ __ _ _ ___ +___ ___ _ _ _ +| \/ | (_) | | (_) +| . . | __ _ _ _ __ | | ___ __ _ _ ___ | |\/| |/ _` | | '_ \ | | / _ \ / _` | |/ __| -| | | | (_| | | | | | | |___| (_) | (_| | | (__ +| | | | (_| | | | | | | |___| (_) | (_| | | (__ \_| |_/\__,_|_|_| |_| \_____/\___/ \__, |_|\___| - __/ | - |___/ + __/ | + |___/ ]]-- --the main loop @@ -859,13 +831,13 @@ mobs.mob_step = function(self, dtime) end --color modifier which coincides with the pause_timer - if self.old_health and self.health < self.old_health then + if self.old_health and self.health < self.old_health then self.object:set_texture_mod("^[colorize:red:120") --fix double death sound if self.health > 0 then mobs.play_sound(self,"damage") end - end + end self.old_health = self.health --do death logic (animation, poof, explosion, etc) @@ -916,7 +888,6 @@ mobs.mob_step = function(self, dtime) elseif self.breath < self.breath_max then self.breath = self.breath + dtime - --clean timer reset if self.breath > self.breath_max then self.breath = self.breath_max @@ -948,10 +919,6 @@ mobs.mob_step = function(self, dtime) end end - - - - --baby grows up if self.baby then --print(self.grow_up_timer) @@ -968,8 +935,6 @@ mobs.mob_step = function(self, dtime) mobs.baby_grow_up(self) end end - - --do custom mob instructions if self.do_custom then @@ -1015,7 +980,7 @@ mobs.mob_step = function(self, dtime) self.memory = self.memory - dtime --get if memory player is within viewing range if self.attacking and self.attacking:is_player() then - local distance = vector_distance(self.object:get_pos(), self.attacking:get_pos()) + local distance = vector.distance(self.object:get_pos(), self.attacking:get_pos()) if distance > self.view_range then self.memory = 0 end @@ -1090,7 +1055,7 @@ mobs.mob_step = function(self, dtime) --jump only (like slimes) if self.jump_only then jump_state_switch(self, dtime) - jump_state_execution(self, dtime) + jump_state_execution(self, dtime) --swimming elseif self.swim then swim_state_switch(self, dtime) @@ -1124,28 +1089,22 @@ mobs.mob_step = function(self, dtime) --overrides absolutely everything --mobs get stuck in cobwebs like players if not self.ignores_cobwebs then - local pos = self.object:get_pos() local node = pos and minetest_get_node(pos).name - if node == "mcl_core:cobweb" then - --fight the rest of the api if self.object:get_acceleration().y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) + self.object:set_acceleration(vector.new(0,0,0)) end - mobs.stick_in_cobweb(self) - self.was_stuck_in_cobweb = true - else --do not override other functions if self.was_stuck_in_cobweb == true then --return the mob back to normal self.was_stuck_in_cobweb = nil if self.object:get_acceleration().y == 0 and not self.swim and not self.fly then - self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.object:set_acceleration(vector.new(0,-self.gravity,0)) end end end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index c26d33089..8f2ea9e31 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -1,7 +1,7 @@ -local math_pi = math.pi -local math_floor = math.floor -local math_random = math.random -local HALF_PI = math_pi/2 +local math = math +local vector = vector + +local HALF_PI = math.pi/2 local vector_direction = vector.direction @@ -48,8 +48,7 @@ mobs.set_mob_animation = function(self, anim, fixed_frame) self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, 0, self.animation[anim .. "_loop"] ~= false) - - self.current_animation = anim + self.current_animation = anim end @@ -65,14 +64,14 @@ mobs.death_effect = function(pos, yaw, collisionbox, rotate) max = { x = 0.5, y = 0.5, z = 0.5 } end if rotate then - min = vector.rotate(min, {x=0, y=yaw, z=math_pi/2}) - max = vector.rotate(max, {x=0, y=yaw, z=math_pi/2}) + min = vector.rotate(min, {x=0, y=yaw, z=math.pi/2}) + max = vector.rotate(max, {x=0, y=yaw, z=math.pi/2}) min, max = vector.sort(min, max) min = vector.multiply(min, 0.5) max = vector.multiply(max, 0.5) end - minetest_add_particlespawner({ + minetest.add_particlespawner({ amount = 50, time = 0.001, minpos = vector.add(pos, min), @@ -88,7 +87,7 @@ mobs.death_effect = function(pos, yaw, collisionbox, rotate) texture = "mcl_particles_mob_death.png^[colorize:#000000:255", }) - minetest_sound_play("mcl_mobs_mob_poof", { + minetest.sound_play("mcl_mobs_mob_poof", { pos = pos, gain = 1.0, max_hear_distance = 8, @@ -99,7 +98,6 @@ end --this allows auto facedir rotation while making it so mobs --don't look like wet noodles flopping around mobs.movement_rotation_lock = function(self) - local current_engine_yaw = self.object:get_yaw() local current_lua_yaw = self.yaw diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua index c973f3d1b..f5d33def4 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua @@ -1,11 +1,11 @@ local vector_direction = vector.direction -local minetest_dir_to_yaw = minetest.dir_to_yaw +--local minetest_dir_to_yaw = minetest.dir_to_yaw local vector_distance = vector.distance local vector_multiply = vector.multiply local math_random = math.random --[[ - _ _ _ _ + _ _ _ _ | | | | | | | | | | | | __ _ _ __ __| | | | | | | | / _` | '_ \ / _` | | | @@ -16,14 +16,14 @@ local math_random = math.random --[[ - _____ _ _ -| ___| | | | | -| |____ ___ __ | | ___ __| | ___ + _____ _ _ +| ___| | | | | +| |____ ___ __ | | ___ __| | ___ | __\ \/ / '_ \| |/ _ \ / _` |/ _ \ | |___> <| |_) | | (_) | (_| | __/ \____/_/\_\ .__/|_|\___/ \__,_|\___| - | | - |_| + | | + |_| ]]-- mobs.explode_attack_walk = function(self,dtime) @@ -74,7 +74,6 @@ mobs.explode_attack_walk = function(self,dtime) if node_in_front_of == 1 then mobs.jump(self) end - --do biggening explosion thing if self.explosion_animation and self.explosion_animation > self.explosion_timer then @@ -102,10 +101,10 @@ end --[[ -______ _ -| ___ \ | | -| |_/ / _ _ __ ___| |__ -| __/ | | | '_ \ / __| '_ \ +______ _ +| ___ \ | | +| |_/ / _ _ __ ___| |__ +| __/ | | | '_ \ / __| '_ \ | | | |_| | | | | (__| | | | \_| \__,_|_| |_|\___|_| |_| ]]-- @@ -113,7 +112,6 @@ ______ _ mobs.punch_attack_walk = function(self,dtime) - --this needs an exception if self.attacking == nil or not self.attacking:is_player() then self.attacking = nil @@ -187,14 +185,14 @@ end --[[ -______ _ _ _ _ -| ___ \ (_) | | (_) | -| |_/ / __ ___ _ ___ ___| |_ _| | ___ +______ _ _ _ _ +| ___ \ (_) | | (_) | +| |_/ / __ ___ _ ___ ___| |_ _| | ___ | __/ '__/ _ \| |/ _ \/ __| __| | |/ _ \ | | | | | (_) | | __/ (__| |_| | | __/ \_| |_| \___/| |\___|\___|\__|_|_|\___| - _/ | - |__/ + _/ | + |__/ ]]-- @@ -255,40 +253,39 @@ end --[[ - _ ______ _ _ + _ ______ _ _ | | | ___| | | | | | | |_ | |_ _ | | | | | _| | | | | | | | |_| | | | | |_| | |_| (_) \_| |_|\__, | (_) - __/ | - |___/ + __/ | + |___/ ]]-- --[[ -______ _ _ _ _ -| ___ \ (_) | | (_) | -| |_/ / __ ___ _ ___ ___| |_ _| | ___ +______ _ _ _ _ +| ___ \ (_) | | (_) | +| |_/ / __ ___ _ ___ ___| |_ _| | ___ | __/ '__/ _ \| |/ _ \/ __| __| | |/ _ \ | | | | | (_) | | __/ (__| |_| | | __/ \_| |_| \___/| |\___|\___|\__|_|_|\___| - _/ | - |__/ + _/ | + |__/ ]]-- local random_pitch_multiplier = {-1,1} mobs.projectile_attack_fly = function(self, dtime) - --this needs an exception if self.attacking == nil or not self.attacking:is_player() then self.attacking = nil return end - + --this is specifically for random ghast movement if self.fly_random_while_attack then @@ -315,7 +312,7 @@ mobs.projectile_attack_fly = function(self, dtime) local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) - if distance_from_attacking >= self.reach then + if distance_from_attacking >= self.reach then mobs.set_pitch_while_attacking(self) mobs.set_fly_velocity(self, self.run_velocity) mobs.set_mob_animation(self,"run") diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.txt similarity index 97% rename from mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua rename to mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.txt index 76c062a40..48233d0b4 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.txt @@ -1,4 +1,7 @@ -local disable_physics = function(object, luaentity, ignore_check, reset_movement) +local math = math +local vector = vector + +local function disable_physics(object, luaentity, ignore_check, reset_movement) if luaentity.physical_state == true or ignore_check == true then luaentity.physical_state = false object:set_properties({ @@ -12,7 +15,7 @@ local disable_physics = function(object, luaentity, ignore_check, reset_movement end ----For Water Flowing: -local enable_physics = function(object, luaentity, ignore_check) +local function enable_physics(object, luaentity, ignore_check) if luaentity.physical_state == false or ignore_check == true then luaentity.physical_state = true object:set_properties({ @@ -272,7 +275,7 @@ local falling = function(self, pos) self.object:set_acceleration({ x = 0, - y = -self.fall_speed / (math_max(1, v.y) ^ 2), + y = -self.fall_speed / (math.max(1, v.y) ^ 2), z = 0 }) end @@ -503,9 +506,9 @@ local follow_flop = function(self) if sdef and sdef.walkable then mob_sound(self, "flop") self.object:set_velocity({ - x = math_random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), + x = math.random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), y = FLOP_HEIGHT, - z = math_random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), + z = math.random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), }) end @@ -987,7 +990,7 @@ local check_for_death = function(self, cause, cmi_cause) item_drop(self, cooked, looting) if mod_experience and ((not self.child) or self.type ~= "animal") and (minetest_get_us_time() - self.xp_timestamp <= 5000000) then - mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) + mcl_experience.throw_experience(self.object:get_pos(), math.random(self.xp_min, self.xp_max)) end end end @@ -1361,7 +1364,7 @@ local do_attack = function(self, player) self.state = "attack" -- TODO: Implement war_cry sound without being annoying - --if math_random(0, 100) < 90 then + --if math.random(0, 100) < 90 then --mob_sound(self, "war_cry", true) --end end @@ -1396,7 +1399,7 @@ local mob_sound = function(self, soundname, is_opinion, fixed_pitch) pitch = base_pitch end -- randomize the pitch a bit - pitch = pitch + math_random(-10, 10) * 0.005 + pitch = pitch + math.random(-10, 10) * 0.005 end minetest_sound_play(sound, { object = self.object, @@ -1699,7 +1702,7 @@ local do_env_damage = function(self) end if drowning then - self.breath = math_max(0, self.breath - 1) + self.breath = math.max(0, self.breath - 1) effect(pos, 2, "bubble.png", nil, nil, 1, nil) if self.breath <= 0 then @@ -2044,7 +2047,7 @@ local breed = function(self) -- Give XP if mod_experience then - mcl_experience.throw_experience(pos, math_random(1, 7)) + mcl_experience.throw_experience(pos, math.random(1, 7)) end -- custom breed function @@ -2061,7 +2064,7 @@ local breed = function(self) -- Use texture of one of the parents - local p = math_random(1, 2) + local p = math.random(1, 2) if p == 1 then ent_c.base_texture = parent1.base_texture else @@ -2091,7 +2094,7 @@ local replace = function(self, pos) or not self.replace_what or self.child == true or self.object:get_velocity().y ~= 0 - or math_random(1, self.replace_rate) > 1 then + or math.random(1, self.replace_rate) > 1 then return end @@ -2099,7 +2102,7 @@ local replace = function(self, pos) if type(self.replace_what[1]) == "table" then - local num = math_random(#self.replace_what) + local num = math.random(#self.replace_what) what = self.replace_what[num][1] or "" with = self.replace_what[num][2] or "" @@ -2163,7 +2166,7 @@ function do_states(self) if self.state == "stand" then - if math_random(1, 4) == 1 then + if math.random(1, 4) == 1 then local lp = nil local s = self.object:get_pos() @@ -2189,7 +2192,7 @@ function do_states(self) if lp.x > s.x then yaw = yaw + math_pi end else - yaw = yaw + math_random(-0.5, 0.5) + yaw = yaw + math.random(-0.5, 0.5) end yaw = set_yaw(self, yaw, 8) @@ -2204,7 +2207,7 @@ function do_states(self) if self.walk_chance ~= 0 and self.facing_fence ~= true - and math_random(1, 100) <= self.walk_chance + and math.random(1, 100) <= self.walk_chance and is_at_cliff_or_danger(self) == false then set_velocity(self, self.walk_velocity) @@ -2254,7 +2257,7 @@ function do_states(self) {x = s.x + 5, y = s.y + 1, z = s.z + 5}, {"group:solid"}) - lp = #lp > 0 and lp[math_random(#lp)] + lp = #lp > 0 and lp[math.random(#lp)] -- did we find land? if lp then @@ -2280,8 +2283,8 @@ function do_states(self) else -- Randomly turn - if math_random(1, 100) <= 30 then - yaw = yaw + math_random(-0.5, 0.5) + if math.random(1, 100) <= 30 then + yaw = yaw + math.random(-0.5, 0.5) yaw = set_yaw(self, yaw, 8) end end @@ -2289,9 +2292,9 @@ function do_states(self) yaw = set_yaw(self, yaw, 8) -- otherwise randomly turn - elseif math_random(1, 100) <= 30 then + elseif math.random(1, 100) <= 30 then - yaw = yaw + math_random(-0.5, 0.5) + yaw = yaw + math.random(-0.5, 0.5) yaw = set_yaw(self, yaw, 8) end @@ -2302,7 +2305,7 @@ function do_states(self) end if self.facing_fence == true or cliff_or_danger - or math_random(1, 100) <= 30 then + or math.random(1, 100) <= 30 then set_velocity(self, 0) self.state = "stand" @@ -2602,7 +2605,7 @@ function do_states(self) self.timer = 0 if self.double_melee_attack - and math_random(1, 2) == 1 then + and math.random(1, 2) == 1 then set_animation(self, "punch2") else set_animation(self, "punch") @@ -2669,7 +2672,7 @@ function do_states(self) if self.shoot_interval and self.timer > self.shoot_interval and not minetest_raycast(p, self.attack:get_pos(), false, false):next() - and math_random(1, 100) <= 60 then + and math.random(1, 100) <= 60 then self.timer = 0 set_animation(self, "shoot") @@ -2759,7 +2762,7 @@ end -- Code to execute before custom on_rightclick handling -local on_rightclick_prefix = function(self, clicker) +local function on_rightclick_prefix(self, clicker) local item = clicker:get_wielded_item() -- Name mob with nametag @@ -2785,17 +2788,17 @@ local on_rightclick_prefix = function(self, clicker) return false end -local create_mob_on_rightclick = function(on_rightclick) +--[[local function create_mob_on_rightclick(on_rightclick) return function(self, clicker) local stop = on_rightclick_prefix(self, clicker) if (not stop) and (on_rightclick) then on_rightclick(self, clicker) end end -end +end]] -- set and return valid yaw -local set_yaw = function(self, yaw, delay, dtime) +local function set_yaw(self, yaw, delay, dtime) if not yaw or yaw ~= yaw then yaw = 0 @@ -2805,7 +2808,7 @@ local set_yaw = function(self, yaw, delay, dtime) if delay == 0 then if self.shaking and dtime then - yaw = yaw + (math_random() * 2 - 1) * 5 * dtime + yaw = yaw + (math.random() * 2 - 1) * 5 * dtime end self.yaw(yaw) update_roll(self) @@ -2825,8 +2828,7 @@ function mobs:yaw(self, yaw, delay, dtime) end -mob_step = function() - +--mob_step = function() --if self.state == "die" then -- print("need custom die stop moving thing") -- return @@ -2901,7 +2903,7 @@ mob_step = function() --end -- mob plays random sound at times - --if math_random(1, 70) == 1 then + --if math.random(1, 70) == 1 then -- mob_sound(self, "random", true) --end @@ -2934,11 +2936,11 @@ mob_step = function() --if is_at_water_danger(self) and self.state ~= "attack" then - -- if math_random(1, 10) <= 6 then + -- if math.random(1, 10) <= 6 then -- set_velocity(self, 0) -- self.state = "stand" -- set_animation(self, "stand") - -- yaw = yaw + math_random(-0.5, 0.5) + -- yaw = yaw + math.random(-0.5, 0.5) -- yaw = set_yaw(self, yaw, 8) -- end --end @@ -2982,7 +2984,7 @@ mob_step = function() mcl_burning.extinguish(self.object) self.object:remove() elseif self.lifetimer <= 10 then - if math_random(10) < 4 then + if math.random(10) < 4 then self.despawn_immediately = true else self.lifetimer = 20 @@ -2991,4 +2993,4 @@ mob_step = function() end ]]-- -end +--end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua index 5dc0b8884..57650a9c9 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua @@ -1,14 +1,13 @@ local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius -local vector_distance = vector.distance +local vector = vector --check to see if someone nearby has some tasty food mobs.check_following = function(self) -- returns true or false - --ignore if not self.follow then self.following_person = nil - return(false) + return false end --hey look, this thing works for passive mobs too! @@ -20,20 +19,20 @@ mobs.check_following = function(self) -- returns true or false --safety check if not stack then self.following_person = nil - return(false) + return false end local item_name = stack:get_name() --all checks have passed, that guy has some good looking food if item_name == self.follow then self.following_person = follower - return(true) + return true end end --everything failed self.following_person = nil - return(false) + return false end --a function which attempts to make mobs enter @@ -42,30 +41,30 @@ mobs.enter_breed_state = function(self,clicker) --do not breed if baby if self.baby then - return(false) + return false end --do not do anything if looking for mate or --if cooling off from breeding if self.breed_lookout_timer > 0 or self.breed_timer > 0 then - return(false) + return false end --if this is caught, that means something has gone --seriously wrong if not clicker or not clicker:is_player() then - return(false) + return false end local stack = clicker:get_wielded_item() --safety check if not stack then - return(false) + return false end local item_name = stack:get_name() --all checks have passed, that guy has some good looking food - if item_name == self.follow then + if item_name == self.follow then if not minetest.is_creative_enabled(clicker:get_player_name()) then stack:take_item() clicker:set_wielded_item(stack) @@ -73,11 +72,11 @@ mobs.enter_breed_state = function(self,clicker) self.breed_lookout_timer = self.breed_lookout_timer_goal self.bred = true mobs.play_sound_specific(self,"mobs_mc_animal_eat_generic") - return(true) + return true end --everything failed - return(false) + return false end @@ -96,23 +95,23 @@ mobs.look_for_mate = function(self) for _,mate in pairs(minetest_get_objects_inside_radius(pos1, radius)) do --look for a breeding mate - if mate and mate:get_luaentity() - and mate:get_luaentity()._cmi_is_mob - and mate:get_luaentity().name == self.name + if mate and mate:get_luaentity() + and mate:get_luaentity()._cmi_is_mob + and mate:get_luaentity().name == self.name and mate:get_luaentity().breed_lookout_timer > 0 and mate:get_luaentity() ~= self then local pos2 = mate:get_pos() - local distance = vector_distance(pos1,pos2) + local distance = vector.distance(pos1,pos2) if distance <= radius then - if line_of_sight then + if minetest.line_of_sight then --must add eye height or stuff breaks randomly because of --seethrough nodes being a blocker (like grass) - if minetest_line_of_sight( - vector_new(pos1.x, pos1.y, pos1.z), - vector_new(pos2.x, pos2.y + mate:get_properties().eye_height, pos2.z) + if minetest.line_of_sight( + vector.new(pos1.x, pos1.y, pos1.z), + vector.new(pos2.x, pos2.y + mate:get_properties().eye_height, pos2.z) ) then mates_detected = mates_detected + 1 mates_in_area[mate] = distance @@ -160,14 +159,14 @@ mobs.make_baby_grow_faster = function(self,clicker) if clicker and clicker:is_player() then local stack = clicker:get_wielded_item() --safety check - if not stack then - return(false) + if not stack then + return false end local item_name = stack:get_name() --all checks have passed, that guy has some good looking food if item_name == self.follow then - self.grow_up_timer = self.grow_up_timer - (self.grow_up_timer * 0.10) --take 10 percent off - diminishing returns + self.grow_up_timer = self.grow_up_timer - (self.grow_up_timer * 0.10) --take 10 percent off - diminishing returns if not minetest.is_creative_enabled(clicker:get_player_name()) then stack:take_item() @@ -175,10 +174,8 @@ mobs.make_baby_grow_faster = function(self,clicker) end mobs.play_sound_specific(self,"mobs_mc_animal_eat_generic") - - return(true) + return true end end - - return(false) + return false end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua index 44f43f20f..ed9aec6cd 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua @@ -8,10 +8,8 @@ local vector_direction = vector.direction local integer_test = {-1,1} mobs.collision = function(self) - local pos = self.object:get_pos() - if not self or not self.object or not self.object:get_luaentity() then return end @@ -20,7 +18,7 @@ mobs.collision = function(self) local collisionbox = self.object:get_properties().collisionbox pos.y = pos.y + collisionbox[2] - + local collision_boundary = collisionbox[4] local radius = collision_boundary @@ -41,7 +39,7 @@ mobs.collision = function(self) for _,object in ipairs(minetest_get_objects_inside_radius(pos, radius*1.25)) do if object and object ~= self.object and (object:is_player() or (object:get_luaentity() and object:get_luaentity()._cmi_is_mob == true and object:get_luaentity().health > 0)) and --don't collide with rider, rider don't collide with thing - (not object:get_attach() or (object:get_attach() and object:get_attach() ~= self.object)) and + (not object:get_attach() or (object:get_attach() and object:get_attach() ~= self.object)) and (not self.object:get_attach() or (self.object:get_attach() and self.object:get_attach() ~= object)) then --stop infinite loop collision_count = collision_count + 1 @@ -52,7 +50,7 @@ mobs.collision = function(self) end local pos2 = object:get_pos() - + local object_collisionbox = object:get_properties().collisionbox pos2.y = pos2.y + object_collisionbox[2] @@ -74,7 +72,7 @@ mobs.collision = function(self) local dir = vector.direction(pos,pos2) dir.y = 0 - + --eliminate mob being stuck in corners if dir.x == 0 and dir.z == 0 then --slightly adjust mob position to prevent equal length @@ -84,7 +82,7 @@ mobs.collision = function(self) end local velocity = dir - + --0.5 is the max force multiplier local force = 0.5 - (0.5 * distance / (collision_boundary + object_collision_boundary)) @@ -104,11 +102,9 @@ mobs.collision = function(self) end end end - self.object:add_velocity(vel1) object:add_velocity(vel2) end - end end end @@ -116,7 +112,6 @@ end --this is used for arrow collisions mobs.arrow_hit = function(self, player) - player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = self._damage} diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua index 57cb6e4e5..45e46d3db 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua @@ -1,5 +1,5 @@ local minetest_add_item = minetest.add_item -local minetest_sound_play = minetest.sound_play +--local minetest_sound_play = minetest.sound_play local math_pi = math.pi local math_random = math.random @@ -19,7 +19,7 @@ local item_drop = function(self, cooked, looting_level) return end - local obj, item, num + local obj, item local pos = self.object:get_pos() self.drops = self.drops or {} -- nil check @@ -56,8 +56,11 @@ local item_drop = function(self, cooked, looting_level) -- cook items when true if cooked then - local output = minetest_get_craft_result({ - method = "cooking", width = 1, items = {item}}) + local output = minetest.get_craft_result({ + method = "cooking", + width = 1, + items = {item}, + }) if output and output.item and not output.item:is_empty() then item = output.item:get_name() @@ -117,15 +120,10 @@ mobs.death_logic = function(self, dtime) --the final POOF of a mob despawning if self.death_animation_timer >= 1.25 then - item_drop(self,false,1) - mobs.death_effect(self) - mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) - self.object:remove() - return end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index 7c709c09e..3b204a4bf 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -1,5 +1,5 @@ local minetest_line_of_sight = minetest.line_of_sight -local minetest_dir_to_yaw = minetest.dir_to_yaw +--local minetest_dir_to_yaw = minetest.dir_to_yaw local minetest_yaw_to_dir = minetest.yaw_to_dir local minetest_get_node = minetest.get_node local minetest_get_item_group = minetest.get_item_group @@ -18,19 +18,16 @@ local table_copy = table.copy local math_abs = math.abs -- default function when mobs are blown up with TNT -local do_tnt = function(obj, damage) - +--[[local function do_tnt(obj, damage) obj.object:punch(obj.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = damage}, }, nil) - return false, true, {} -end +end]] --a fast function to be able to detect only players without using objects_in_radius mobs.detect_closest_player_within_radius = function(self, line_of_sight, radius, object_height_adder) - local pos1 = self.object:get_pos() local players_in_area = {} local winner_player = nil @@ -49,7 +46,7 @@ mobs.detect_closest_player_within_radius = function(self, line_of_sight, radius, --must add eye height or stuff breaks randomly because of --seethrough nodes being a blocker (like grass) if minetest_line_of_sight( - vector_new(pos1.x, pos1.y + object_height_adder, pos1.z), + vector_new(pos1.x, pos1.y + object_height_adder, pos1.z), vector_new(pos2.x, pos2.y + player:get_properties().eye_height, pos2.z) ) then players_detected = players_detected + 1 @@ -108,7 +105,7 @@ mobs.jump_check = function(self,dtime) if green_flag_1 and green_flag_2 then --can jump over node return(1) - elseif green_flag_1 and not green_flag_2 then + elseif green_flag_1 and not green_flag_2 then --wall in front of mob return(2) end @@ -180,15 +177,10 @@ end -- check if within physical map limits (-30911 to 30927) -- within_limits, wmin, wmax = nil, -30913, 30928 mobs.within_limits = function(pos, radius) + local wmin, wmax if mcl_vars then if mcl_vars.mapgen_edge_min and mcl_vars.mapgen_edge_max then wmin, wmax = mcl_vars.mapgen_edge_min, mcl_vars.mapgen_edge_max - within_limits = function(pos, radius) - return pos - and (pos.x - radius) > wmin and (pos.x + radius) < wmax - and (pos.y - radius) > wmin and (pos.y + radius) < wmax - and (pos.z - radius) > wmin and (pos.z + radius) < wmax - end end end return pos diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua index 0fc94ffe6..13bc6584d 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua @@ -1,112 +1,98 @@ -local vector_new = vector.new - +local math = math +local vector = vector --converts yaw to degrees local degrees = function(yaw) return(yaw*180.0/math.pi) end - mobs.do_head_logic = function(self,dtime) - local player = minetest.get_player_by_name("singleplayer") + local player = minetest.get_player_by_name("singleplayer") - local look_at = player:get_pos() - look_at.y = look_at.y + player:get_properties().eye_height + local look_at = player:get_pos() + look_at.y = look_at.y + player:get_properties().eye_height + + local pos = self.object:get_pos() + + local body_yaw = self.object:get_yaw() + + local body_dir = minetest.yaw_to_dir(body_yaw) + + pos.y = pos.y + self.head_height_offset + + local head_offset = vector.multiply(body_dir, self.head_direction_offset) + + pos = vector.add(pos, head_offset) + + minetest.add_particle({ + pos = pos, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0, z=0}, + expirationtime = 0.2, + size = 1, + texture = "default_dirt.png", + }) + + local bone_pos = vector.new(0,0,0) + + --(horizontal) + bone_pos.y = self.head_bone_pos_y + + --(vertical) + bone_pos.z = self.head_bone_pos_z + + --print(yaw) + + --local _, bone_rot = self.object:get_bone_position("head") + + --bone_rot.x = bone_rot.x + (dtime * 10) + --bone_rot.z = bone_rot.z + (dtime * 10) + + local head_yaw = minetest.dir_to_yaw(vector.direction(pos,look_at)) - body_yaw + + if self.reverse_head_yaw then + head_yaw = head_yaw * -1 + end + + --over rotation protection + --stops radians from going out of spec + if head_yaw > math.pi then + head_yaw = head_yaw - (math.pi * 2) + elseif head_yaw < -math.pi then + head_yaw = head_yaw + (math.pi * 2) + end + local check_failed = false + --upper check + 90 degrees or upper math.radians (3.14/2) + if head_yaw > math.pi - (math.pi/2) then + head_yaw = 0 + check_failed = true + --lower check - 90 degrees or lower negative math.radians (-3.14/2) + elseif head_yaw < -math.pi + (math.pi/2) then + head_yaw = 0 + check_failed = true + end + local head_pitch = 0 - local pos = self.object:get_pos() + --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG + --head_yaw = 0 + --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG - local body_yaw = self.object:get_yaw() + if not check_failed then + head_pitch = minetest.dir_to_yaw(vector.new(vector.distance(vector.new(pos.x,0,pos.z),vector.new(look_at.x,0,look_at.z)),0,pos.y-look_at.y))+(math.pi/2) + end - local body_dir = minetest.yaw_to_dir(body_yaw) + if self.head_pitch_modifier then + head_pitch = head_pitch + self.head_pitch_modifier + end - - pos.y = pos.y + self.head_height_offset - - local head_offset = vector.multiply(body_dir, self.head_direction_offset) - - pos = vector.add(pos, head_offset) - - - - - minetest.add_particle({ - pos = pos, - velocity = {x=0, y=0, z=0}, - acceleration = {x=0, y=0, z=0}, - expirationtime = 0.2, - size = 1, - texture = "default_dirt.png", - }) - - - local bone_pos = vector_new(0,0,0) - - - --(horizontal) - bone_pos.y = self.head_bone_pos_y - - --(vertical) - bone_pos.z = self.head_bone_pos_z - - --print(yaw) - - --local _, bone_rot = self.object:get_bone_position("head") - - --bone_rot.x = bone_rot.x + (dtime * 10) - --bone_rot.z = bone_rot.z + (dtime * 10) - - - local head_yaw - head_yaw = minetest.dir_to_yaw(vector.direction(pos,look_at)) - body_yaw - - if self.reverse_head_yaw then - head_yaw = head_yaw * -1 - end - - --over rotation protection - --stops radians from going out of spec - if head_yaw > math.pi then - head_yaw = head_yaw - (math.pi * 2) - elseif head_yaw < -math.pi then - head_yaw = head_yaw + (math.pi * 2) - end - - - local check_failed = false - --upper check + 90 degrees or upper math.radians (3.14/2) - if head_yaw > math.pi - (math.pi/2) then - head_yaw = 0 - check_failed = true - --lower check - 90 degrees or lower negative math.radians (-3.14/2) - elseif head_yaw < -math.pi + (math.pi/2) then - head_yaw = 0 - check_failed = true - end - - local head_pitch = 0 - - --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG - --head_yaw = 0 - --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG - - if not check_failed then - head_pitch = minetest.dir_to_yaw(vector.new(vector.distance(vector.new(pos.x,0,pos.z),vector.new(look_at.x,0,look_at.z)),0,pos.y-look_at.y))+(math.pi/2) - end - - if self.head_pitch_modifier then - head_pitch = head_pitch + self.head_pitch_modifier - end - - if self.swap_y_with_x then - self.object:set_bone_position(self.head_bone, bone_pos, vector_new(degrees(head_pitch),degrees(head_yaw),0)) - else - self.object:set_bone_position(self.head_bone, bone_pos, vector_new(degrees(head_pitch),0,degrees(head_yaw))) - end - - - --set_bone_position([bone, position, rotation]) + if self.swap_y_with_x then + self.object:set_bone_position(self.head_bone, bone_pos, vector.new(degrees(head_pitch),degrees(head_yaw),0)) + else + self.object:set_bone_position(self.head_bone, bone_pos, vector.new(degrees(head_pitch),0,degrees(head_yaw))) + end + --set_bone_position([bone, position, rotation]) end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index 6b23d2fe7..fa5b31210 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -2,22 +2,19 @@ local minetest_after = minetest.after local minetest_sound_play = minetest.sound_play local minetest_dir_to_yaw = minetest.dir_to_yaw -local math_floor = math.floor -local math_min = math.min -local math_random = math.random - -local vector_direction = vector.direction -local vector_multiply = vector.multiply +local math = math +local vector = vector local MAX_MOB_NAME_LENGTH = 30 +local mod_hunger = minetest.get_modpath("mcl_hunger") + mobs.feed_tame = function(self) return nil end -- Code to execute before custom on_rightclick handling -local on_rightclick_prefix = function(self, clicker) - +local function on_rightclick_prefix(self, clicker) local item = clicker:get_wielded_item() -- Name mob with nametag @@ -60,7 +57,6 @@ end -- deal damage and effects when mob punched mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) - --don't do anything if the mob is already dead if self.health <= 0 then return @@ -94,14 +90,13 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) pos2.y = 0 - local dir = vector_direction(pos2,pos1) + local dir = vector.direction(pos2,pos1) local yaw = minetest_dir_to_yaw(dir) self.yaw = yaw end - -- custom punch function if self.do_punch then -- when false skip going any further @@ -113,23 +108,20 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) --don't do damage until pause timer resets if self.pause_timer > 0 then return - end + end - -- error checking when mod profiling is enabled if not tool_capabilities then minetest.log("warning", "[mobs_mc] Mod profiling enabled, damage not enabled") return end - local is_player = hitter:is_player() - -- punch interval local weapon = hitter:get_wielded_item() - local punch_interval = 1.4 + --local punch_interval = 1.4 -- exhaust attacker if mod_hunger and is_player then @@ -139,7 +131,6 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- calculate mob damage local damage = 0 local armor = self.object:get_armor_groups() or {} - local tmp --calculate damage groups for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do @@ -163,13 +154,13 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- healing if damage <= -1 then - self.health = self.health - math_floor(damage) + self.health = self.health - math.floor(damage) return end - if tool_capabilities then - punch_interval = tool_capabilities.full_punch_interval or 1.4 - end + --if tool_capabilities then + -- punch_interval = tool_capabilities.full_punch_interval or 1.4 + --end -- add weapon wear manually -- Required because we have custom health handling ("health" property) @@ -183,7 +174,7 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) local weapon = hitter:get_wielded_item(player) local def = weapon:get_definition() if def.tool_capabilities and def.tool_capabilities.punch_attack_uses then - local wear = math_floor(65535/tool_capabilities.punch_attack_uses) + local wear = math.floor(65535/tool_capabilities.punch_attack_uses) weapon:add_wear(wear) hitter:set_wielded_item(weapon) end @@ -224,7 +215,7 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- knock back effect local velocity = self.object:get_velocity() - + --2d direction local pos1 = self.object:get_pos() pos1.y = 0 @@ -240,9 +231,8 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) up = 0 end - --0.75 for perfect distance to not be too easy, and not be too hard - local multiplier = 0.75 + local multiplier = 0.75 -- check if tool already has specific knockback value local knockback_enchant = mcl_enchanting.get_enchantment(hitter:get_wielded_item(), "knockback") @@ -254,21 +244,16 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) --it's coming for you if self.hostile then multiplier = multiplier + 2 - end - - dir = vector_multiply(dir,multiplier) - + end + dir = vector.multiply(dir,multiplier) dir.y = up - --add the velocity self.object:add_velocity(dir) - end end --do internal per mob projectile calculations mobs.shoot_projectile = function(self) - local pos1 = self.object:get_pos() --add mob eye height pos1.y = pos1.y + self.eye_height @@ -278,7 +263,7 @@ mobs.shoot_projectile = function(self) pos2.y = pos2.y + self.attacking:get_properties().eye_height --get direction - local dir = vector_direction(pos1,pos2) + local dir = vector.direction(pos1,pos2) --call internal shoot_arrow function self.shoot_arrow(self,pos1,dir) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua index 847315ff1..83df80992 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua @@ -1,9 +1,8 @@ local minetest_add_particlespawner = minetest.add_particlespawner mobs.death_effect = function(self) - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + --local yaw = self.object:get_yaw() local collisionbox = self.object:get_properties().collisionbox local min, max @@ -33,7 +32,7 @@ end mobs.critical_effect = function(self) local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + --local yaw = self.object:get_yaw() local collisionbox = self.object:get_properties().collisionbox local min, max @@ -62,9 +61,8 @@ end --when feeding a mob mobs.feed_effect = function(self) - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + --local yaw = self.object:get_yaw() local collisionbox = self.object:get_properties().collisionbox local min, max @@ -94,7 +92,7 @@ end --hearts when tamed mobs.tamed_effect = function(self) local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + --local yaw = self.object:get_yaw() local collisionbox = self.object:get_properties().collisionbox local min, max @@ -124,7 +122,7 @@ end --hearts when breeding mobs.breeding_effect = function(self) local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + --local yaw = self.object:get_yaw() local collisionbox = self.object:get_properties().collisionbox local min, max diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 04e3e370c..72612b1eb 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -1,16 +1,10 @@ -local math_pi = math.pi -local math_sin = math.sin -local math_cos = math.cos -local math_random = math.random -local HALF_PI = math_pi / 2 -local DOUBLE_PI = math_pi * 2 +-- localize math functions +local math = math +local HALF_PI = math.pi / 2 +local DOUBLE_PI = math.pi * 2 -- localize vector functions -local vector_new = vector.new -local vector_length = vector.length -local vector_multiply = vector.multiply -local vector_distance = vector.distance -local vector_normalize = vector.normalize +local vector = vector local minetest_yaw_to_dir = minetest.yaw_to_dir local minetest_dir_to_yaw = minetest.dir_to_yaw @@ -19,18 +13,17 @@ local DEFAULT_JUMP_HEIGHT = 5 local DEFAULT_FLOAT_SPEED = 4 local DEFAULT_CLIMB_SPEED = 3 - mobs.stick_in_cobweb = function(self) local current_velocity = self.object:get_velocity() - local goal_velocity = vector_multiply(vector_normalize(current_velocity), 0.4) + local goal_velocity = vector.multiply(vector.normalize(current_velocity), 0.4) goal_velocity.y = -0.5 local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -40,7 +33,7 @@ mobs.float = function(self) local acceleration = self.object:get_acceleration() if acceleration and acceleration.y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) + self.object:set_acceleration(vector.new(0,0,0)) else return end @@ -59,7 +52,7 @@ mobs.float = function(self) new_velocity_addition.z = 0 --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -81,7 +74,7 @@ mobs.climb = function(self) new_velocity_addition.z = 0 --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -109,22 +102,22 @@ mobs.set_velocity = function(self, v) local current_velocity = self.object:get_velocity() local goal_velocity = { - x = (math_sin(yaw) * -v), + x = (math.sin(yaw) * -v), y = 0, - z = (math_cos(yaw) * v), + z = (math.cos(yaw) * v), } local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) end new_velocity_addition.y = 0 --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -139,7 +132,7 @@ mobs.get_velocity = function(self) v.y = 0 if v then - return vector_length(v) + return vector.length(v) end return 0 @@ -155,7 +148,7 @@ mobs.jump = function(self, velocity) --fallback velocity to allow modularity velocity = velocity or DEFAULT_JUMP_HEIGHT - self.object:add_velocity(vector_new(0,velocity,0)) + self.object:add_velocity(vector.new(0,velocity,0)) end --make mobs fall slowly @@ -175,15 +168,15 @@ mobs.mob_fall_slow = function(self) new_velocity_addition.x = 0 new_velocity_addition.z = 0 - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) end new_velocity_addition.x = 0 new_velocity_addition.z = 0 --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end @@ -215,13 +208,13 @@ mobs.flop = function(self, velocity) velocity = velocity or DEFAULT_JUMP_HEIGHT --create a random direction (2d yaw) - local dir = DOUBLE_PI * math_random() + local dir = DOUBLE_PI * math.random() --create a random force value - local force = math_random(0,3) + math_random() + local force = math.random(0,3) + math.random() --convert the yaw to a direction vector then multiply it times the force - local final_additional_force = vector_multiply(minetest_yaw_to_dir(dir), force) + local final_additional_force = vector.multiply(minetest_yaw_to_dir(dir), force) --place in the "flop" velocity to make the mob flop final_additional_force.y = velocity @@ -249,20 +242,20 @@ mobs.set_swim_velocity = function(self, v) local current_velocity = self.object:get_velocity() local goal_velocity = { - x = (math_sin(yaw) * -v), + x = (math.sin(yaw) * -v), y = pitch, - z = (math_cos(yaw) * v), + z = (math.cos(yaw) * v), } local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) end --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -294,20 +287,20 @@ mobs.set_fly_velocity = function(self, v) local current_velocity = self.object:get_velocity() local goal_velocity = { - x = (math_sin(yaw) * -v), + x = (math.sin(yaw) * -v), y = pitch, - z = (math_cos(yaw) * v), + z = (math.cos(yaw) * v), } local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) end --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -319,7 +312,7 @@ mobs.calculate_pitch = function(pos1, pos2) return false end - return(minetest_dir_to_yaw(vector_new(vector_distance(vector_new(pos1.x,0,pos1.z),vector_new(pos2.x,0,pos2.z)),0,pos1.y - pos2.y)) + HALF_PI) + return(minetest_dir_to_yaw(vector.new(vector.distance(vector.new(pos1.x,0,pos1.z),vector.new(pos2.x,0,pos2.z)),0,pos1.y - pos2.y)) + HALF_PI) end --make mobs fly up or down based on their y difference @@ -356,27 +349,27 @@ mobs.jump_move = function(self, velocity) mobs.set_velocity(self,0) --fallback velocity to allow modularity - jump_height = DEFAULT_JUMP_HEIGHT + local jump_height = DEFAULT_JUMP_HEIGHT local yaw = (self.yaw or 0) local current_velocity = self.object:get_velocity() local goal_velocity = { - x = (math_sin(yaw) * -velocity), + x = (math.sin(yaw) * -velocity), y = jump_height, - z = (math_cos(yaw) * velocity), + z = (math.cos(yaw) * velocity), } local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) end --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua index dfef98ee8..65ba764f6 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -1,10 +1,12 @@ local math_random = math.random -local minetest_settings = minetest.settings +local minetest_settings = minetest.settings + +-- CMI support check +local use_cmi = minetest.global_exists("cmi") -- get entity staticdata mobs.mob_staticdata = function(self) - --despawn mechanism --don't despawned tamed or bred mobs if not self.tamed and not self.bred then @@ -142,8 +144,6 @@ mobs.mob_activate = function(self, staticdata, def, dtime) self.health = math_random (self.hp_min, self.hp_max) end - - if not self.random_sound_timer then self.random_sound_timer = math_random(self.random_sound_timer_min,self.random_sound_timer_max) end @@ -185,7 +185,6 @@ mobs.mob_activate = function(self, staticdata, def, dtime) self.opinion_sound_cooloff = 0 -- used to prevent sound spam of particular sound types self.texture_mods = {} - self.v_start = false self.timer = 0 @@ -199,7 +198,6 @@ mobs.mob_activate = function(self, staticdata, def, dtime) else self.object:set_texture_mod("") end - -- set anything changed above self.object:set_properties(self) diff --git a/mods/ENTITIES/mcl_mobs/api/mount.lua b/mods/ENTITIES/mcl_mobs/api/mount.lua index 8ee45f299..0ed54a46e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mount.lua +++ b/mods/ENTITIES/mcl_mobs/api/mount.lua @@ -1,8 +1,11 @@ -- lib_mount by Blert2112 (edited by TenPlus1) -local enable_crash = false -local crash_threshold = 6.5 -- ignored if enable_crash=false +--local enable_crash = false +--local crash_threshold = 6.5 -- ignored if enable_crash=false + +local math = math +local vector = vector ------------------------------------------------------------------------------ @@ -10,7 +13,7 @@ local crash_threshold = 6.5 -- ignored if enable_crash=false -- Helper functions -- -local node_ok = function(pos, fallback) +--[[local function node_ok(pos, fallback) fallback = fallback or mobs.fallback_node @@ -21,10 +24,10 @@ local node_ok = function(pos, fallback) end return {name = fallback} -end +end]] -local function node_is(pos) +--[[local function node_is(pos) local node = node_ok(pos) @@ -45,7 +48,7 @@ local function node_is(pos) end return "other" -end +end]] local function get_sign(i) @@ -60,13 +63,11 @@ local function get_sign(i) end -local function get_velocity(v, yaw, y) - +--[[local function get_velocity(v, yaw, y) local x = -math.sin(yaw) * v local z = math.cos(yaw) * v - return {x = x, y = y, z = z} -end +end]] local function get_v(v) @@ -172,7 +173,7 @@ function mobs.detach(player, offset) --pos = {x = pos.x + offset.x, y = pos.y + 0.2 + offset.y, z = pos.z + offset.z} - player:add_velocity(vector.new(math.random(-6,6),math.random(5,8),math.random(-6,6))) --throw the rider off + player:add_velocity(vector.new(math.random(-6,6), math.random(5,8), math.random(-6,6))) --throw the rider off --[[ minetest.after(0.1, function(name, pos) @@ -187,13 +188,13 @@ end function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) - local rot_view = 0 + --local rot_view = 0 - if entity.player_rotation.y == 90 then - rot_view = math.pi/2 - end + --if entity.player_rotation.y == 90 then + -- rot_view = math.pi/2 + --end - local acce_y = 0 + --local acce_y = 0 local velo = entity.object:get_velocity() entity.v = get_v(velo) * get_sign(entity.v) @@ -388,7 +389,6 @@ end -- directional flying routine by D00Med (edited by TenPlus1) function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) - if true then print("succ") return diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index ca4dc1e4f..08b161527 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -9,9 +9,9 @@ local get_objects_inside_radius = minetest.get_objects_inside_radius local math_random = math.random local math_floor = math.floor -local max = math.max +--local max = math.max -local vector_distance = vector.distance +--local vector_distance = vector.distance local vector_new = vector.new local vector_floor = vector.floor @@ -573,10 +573,10 @@ if mobs_spawn then local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)] --Prevent strange behavior --- this is commented out: /too close to player --fixed with inner circle - if not spawning_position then -- or vector_distance(player_pos, spawning_position) < 15 + if not spawning_position then -- or vector_distance(player_pos, spawning_position) < 15 break end - + --hard code mob limit in area to 5 for now if count_mobs(spawning_position) >= 5 then break @@ -606,7 +606,7 @@ if mobs_spawn then local is_lava = get_item_group(gotten_node, "lava") ~= 0 local mob_def = nil - + --create a disconnected clone of the spawn dictionary --prevents memory leak local mob_library_worker_table = table_copy(spawn_dictionary) From 8286fd2a4dc5efb81e58fd38d0770344c9ec76ed Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:43:08 +0200 Subject: [PATCH 03/38] [mcl_minecarts] fix warnings --- mods/ENTITIES/mcl_minecarts/init.lua | 46 +++++++++++++--------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 70bf16477..e741fb0bc 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -486,7 +486,6 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o if update.pos then self.object:set_pos(pos) end - update = nil end function cart:get_staticdata() @@ -817,31 +816,30 @@ minetest.register_craft({ }) -- TODO: Re-enable crafting of special minecarts when they have been implemented -if false then - minetest.register_craft({ - output = "mcl_minecarts:furnace_minecart", - recipe = { - {"mcl_furnaces:furnace"}, - {"mcl_minecarts:minecart"}, - }, - }) +--[[minetest.register_craft({ + output = "mcl_minecarts:furnace_minecart", + recipe = { + {"mcl_furnaces:furnace"}, + {"mcl_minecarts:minecart"}, + }, +}) - minetest.register_craft({ - output = "mcl_minecarts:hopper_minecart", - recipe = { - {"mcl_hoppers:hopper"}, - {"mcl_minecarts:minecart"}, - }, - }) +minetest.register_craft({ + output = "mcl_minecarts:hopper_minecart", + recipe = { + {"mcl_hoppers:hopper"}, + {"mcl_minecarts:minecart"}, + }, +}) + +minetest.register_craft({ + output = "mcl_minecarts:chest_minecart", + recipe = { + {"mcl_chests:chest"}, + {"mcl_minecarts:minecart"}, + }, +})]] - minetest.register_craft({ - output = "mcl_minecarts:chest_minecart", - recipe = { - {"mcl_chests:chest"}, - {"mcl_minecarts:minecart"}, - }, - }) -end if has_mcl_wip then mcl_wip.register_wip_item("mcl_minecarts:chest_minecart") From fddaacdeaea953d7cf73a73214dd4329325e5cc3 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:43:42 +0200 Subject: [PATCH 04/38] [mcl_item_entity] fix warnings --- mods/ENTITIES/mcl_item_entity/init.lua | 4 ---- mods/ENTITIES/mcl_minecarts/functions.lua | 23 ++++++++++------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 895bfc892..0c26c38c8 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -426,13 +426,9 @@ minetest.register_entity(":__builtin:item", { if itemtable then itemname = stack:to_table().name end - local item_texture = nil - local item_type = "" local glow local def = minetest.registered_items[itemname] if def then - item_texture = def.inventory_image - item_type = def.type description = def.description glow = def.light_source end diff --git a/mods/ENTITIES/mcl_minecarts/functions.lua b/mods/ENTITIES/mcl_minecarts/functions.lua index 42cdecd12..2f0dfe0ae 100644 --- a/mods/ENTITIES/mcl_minecarts/functions.lua +++ b/mods/ENTITIES/mcl_minecarts/functions.lua @@ -1,3 +1,5 @@ +local vector = vector + function mcl_minecarts:get_sign(z) if z == 0 then return 0 @@ -38,11 +40,9 @@ end function mcl_minecarts:check_front_up_down(pos, dir_, check_down, railtype) local dir = vector.new(dir_) - local cur = nil - -- Front dir.y = 0 - cur = vector.add(pos, dir) + local cur = vector.add(pos, dir) if mcl_minecarts:is_rail(cur, railtype) then return dir end @@ -65,9 +65,9 @@ end function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) local pos = vector.round(pos_) - local cur = nil + local cur local left_check, right_check = true, true - + -- Check left and right local left = {x=0, y=0, z=0} local right = {x=0, y=0, z=0} @@ -78,7 +78,7 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) left.z = dir.x right.z = -dir.x end - + if ctrl then if old_switch == 1 then left_check = false @@ -100,13 +100,13 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) right_check = true end end - + -- Normal cur = mcl_minecarts:check_front_up_down(pos, dir, true, railtype) if cur then return cur end - + -- Left, if not already checked if left_check then cur = mcl_minecarts:check_front_up_down(pos, left, false, railtype) @@ -114,7 +114,7 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) return cur end end - + -- Right, if not already checked if right_check then cur = mcl_minecarts:check_front_up_down(pos, right, false, railtype) @@ -122,7 +122,6 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) return cur end end - -- Backwards if not old_switch then cur = mcl_minecarts:check_front_up_down(pos, { @@ -134,7 +133,5 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) return cur end end - return {x=0, y=0, z=0} -end - +end \ No newline at end of file From dd3b5a98ae36bbdffec0d846e44a9ce72643abfe Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:46:39 +0200 Subject: [PATCH 05/38] [mcl_falling_nodes] fix warnings --- mods/ENTITIES/mcl_falling_nodes/init.lua | 22 +++++-------------- .../locale/mcl_falling_nodes.de.tr | 3 --- .../locale/mcl_falling_nodes.es.tr | 3 --- .../locale/mcl_falling_nodes.fr.tr | 3 --- .../locale/mcl_falling_nodes.ru.tr | 3 --- .../mcl_falling_nodes/locale/template.txt | 3 --- 6 files changed, 6 insertions(+), 31 deletions(-) delete mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr delete mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr delete mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr delete mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr delete mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/template.txt diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index af2c06703..01681a159 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -1,7 +1,4 @@ -local S = minetest.get_translator("mcl_falling_nodes") -local has_mcl_armor = minetest.get_modpath("mcl_armor") - -local get_falling_depth = function(self) +local function get_falling_depth(self) if not self._startpos then -- Fallback self._startpos = self.object:get_pos() @@ -9,7 +6,7 @@ local get_falling_depth = function(self) return self._startpos.y - vector.round(self.object:get_pos()).y end -local deal_falling_damage = function(self, dtime) +local function deal_falling_damage(self, dtime) if minetest.get_item_group(self.node.name, "falling_node_damage") == 0 then return end @@ -38,7 +35,7 @@ local deal_falling_damage = function(self, dtime) inv:set_stack("armor", 2, helmet) end end - local deathmsg, dmg_type + local dmg_type if minetest.get_item_group(self.node.name, "anvil") ~= 0 then dmg_type = "anvil" else @@ -60,10 +57,8 @@ minetest.register_entity(":__builtin:falling_node", { collide_with_objects = false, collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, }, - node = {}, meta = {}, - set_node = function(self, node, meta) local def = minetest.registered_nodes[node.name] -- Change falling node if definition tells us to @@ -90,7 +85,6 @@ minetest.register_entity(":__builtin:falling_node", { glow = glow, }) end, - get_staticdata = function(self) local meta = self.meta -- Workaround: Save inventory seperately from metadata. @@ -111,7 +105,6 @@ minetest.register_entity(":__builtin:falling_node", { } return minetest.serialize(ds) end, - on_activate = function(self, staticdata) self.object:set_armor_groups({immortal = 1}) @@ -134,7 +127,6 @@ minetest.register_entity(":__builtin:falling_node", { end self._startpos = vector.round(self._startpos) end, - on_step = function(self, dtime) -- Set gravity local acceleration = self.object:get_acceleration() @@ -186,10 +178,9 @@ minetest.register_entity(":__builtin:falling_node", { return end local nd = minetest.registered_nodes[n2.name] - if n2.name == "mcl_portals:portal_end" then - -- TODO: Teleport falling node. - - elseif (nd and nd.buildable_to == true) or minetest.get_item_group(self.node.name, "crush_after_fall") ~= 0 then + --if n2.name == "mcl_portals:portal_end" then + -- TODO: Teleport falling node. + if (nd and nd.buildable_to == true) or minetest.get_item_group(self.node.name, "crush_after_fall") ~= 0 then -- Replace destination node if it's buildable to minetest.remove_node(np) -- Run script hook @@ -256,7 +247,6 @@ minetest.register_entity(":__builtin:falling_node", { self.object:set_pos(npos) end end - deal_falling_damage(self, dtime) end }) diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr deleted file mode 100644 index 71dfa4be9..000000000 --- a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_falling_nodes -@1 was smashed by a falling anvil.=@1 wurde von einem fallenden Amboss zerschmettert. -@1 was smashed by a falling block.=@1 wurde von einem fallenden Block zerschmettert. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr deleted file mode 100644 index 41cbf61b4..000000000 --- a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_falling_nodes -@1 was smashed by a falling anvil.=@1 fue aplastado por la caída de un yunque. -@1 was smashed by a falling block.=@1 fue aplastado por la caída de un bloque. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr deleted file mode 100644 index 781cd7048..000000000 --- a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_falling_nodes -@1 was smashed by a falling anvil.=@1 a été écrasé par une enclume qui tombait. -@1 was smashed by a falling block.=@1 a été écrasé par un bloc qui tombait. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr deleted file mode 100644 index 6c8b9375a..000000000 --- a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_falling_nodes -@1 was smashed by a falling anvil.=@1 придавило падающей наковальней. -@1 was smashed by a falling block.=@1 раздавило падающим блоком. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/template.txt b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt deleted file mode 100644 index 4adabaf01..000000000 --- a/mods/ENTITIES/mcl_falling_nodes/locale/template.txt +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_falling_nodes -@1 was smashed by a falling anvil.= -@1 was smashed by a falling block.= From ad16fe70726807ff5c5cbcc9a8ba8bd28c8d137d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:48:46 +0200 Subject: [PATCH 06/38] [mcl_burning] fix warnings --- mods/ENTITIES/mcl_burning/api.lua | 4 +--- mods/ENTITIES/mcl_burning/init.lua | 6 +----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index 78814a2c7..4cb19cca1 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -1,5 +1,3 @@ -local S = minetest.get_translator("mcl_burning") - function mcl_burning.get_storage(obj) return obj:is_player() and mcl_burning.storage[obj] or obj:get_luaentity() end @@ -145,4 +143,4 @@ function mcl_burning.tick(obj, dtime, storage) end end end -end +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index e1943e1bc..5cf0d85fe 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -1,5 +1,4 @@ -local S = minetest.get_translator("mcl_burning") -local modpath = minetest.get_modpath("mcl_burning") +local modpath = minetest.get_modpath(minetest.get_current_modname()) mcl_burning = { storage = {}, @@ -56,7 +55,6 @@ minetest.register_on_leaveplayer(function(player) local storage = mcl_burning.storage[player] storage.fire_hud_id = nil player:get_meta():set_string("mcl_burning:data", minetest.serialize(storage)) - mcl_burning.storage[player] = nil end) @@ -70,10 +68,8 @@ minetest.register_entity("mcl_burning:fire", { glow = -1, backface_culling = false, }, - animation_frame = 0, animation_timer = 0, - on_step = function(self, dtime) local parent, storage = self:sanity_check() From be9fff4fe25d15c642f62027fc64f02b2db78f5a Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:50:04 +0200 Subject: [PATCH 07/38] [mcl_boats] fix warnings --- mods/ENTITIES/mcl_boats/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 5facec28a..8c187617c 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -328,10 +328,10 @@ function boat.on_step(self, dtime, moveresult) p.y = p.y - boat_y_offset local new_velo - local new_acce = {x = 0, y = 0, z = 0} + local new_acce if not is_water(p) and not on_ice then -- Not on water or inside water: Free fall - local nodedef = minetest.registered_nodes[minetest.get_node(p).name] + --local nodedef = minetest.registered_nodes[minetest.get_node(p).name] new_acce = {x = 0, y = -9.8, z = 0} new_velo = get_velocity(self._v, self.object:get_yaw(), self.object:get_velocity().y) From 0d13e1ffdd2169730427865fc4b3fc0df90eadf4 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:54:12 +0200 Subject: [PATCH 08/38] [drippingwater] fix warnings --- mods/ENTITIES/drippingwater/init.lua | 85 ++++++++++++---------------- 1 file changed, 37 insertions(+), 48 deletions(-) diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua index 730cb7b77..e17bdda40 100644 --- a/mods/ENTITIES/drippingwater/init.lua +++ b/mods/ENTITIES/drippingwater/init.lua @@ -1,6 +1,8 @@ --Dripping Water Mod --by kddekadenz +local math = math + -- License of code, textures & sounds: CC0 --Drop entities @@ -20,26 +22,21 @@ minetest.register_entity("drippingwater:drop_water", { spritediv = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, static_save = false, - on_activate = function(self, staticdata) self.object:set_sprite({x=0,y=0}, 1, 1, true) end, - on_step = function(self, dtime) - local k = math.random(1,222) - local ownpos = self.object:get_pos() - - if k==1 then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - - if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - + local k = math.random(1,222) + local ownpos = self.object:get_pos() + if k==1 then + self.object:set_acceleration({x=0, y=-5, z=0}) + end + if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then + self.object:set_acceleration({x=0, y=-5, z=0}) + end if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then - self.object:remove() - minetest.sound_play({name="drippingwater_drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) + self.object:remove() + minetest.sound_play({name="drippingwater_drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) end end, }) @@ -61,27 +58,21 @@ minetest.register_entity("drippingwater:drop_lava", { spritediv = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, static_save = false, - on_activate = function(self, staticdata) self.object:set_sprite({x=0,y=0}, 1, 0, true) end, - on_step = function(self, dtime) - local k = math.random(1,222) - local ownpos = self.object:get_pos() - - if k==1 then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - - if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - - + local k = math.random(1,222) + local ownpos = self.object:get_pos() + if k == 1 then + self.object:set_acceleration({x=0, y=-5, z=0}) + end + if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then + self.object:set_acceleration({x=0, y=-5, z=0}) + end if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then - self.object:remove() - minetest.sound_play({name="drippingwater_lavadrip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) + self.object:remove() + minetest.sound_play({name="drippingwater_lavadrip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) end end, }) @@ -90,36 +81,34 @@ minetest.register_entity("drippingwater:drop_lava", { --Create drop -minetest.register_abm( - { +minetest.register_abm({ label = "Create water drops", nodenames = {"group:opaque", "group:leaves"}, neighbors = {"group:water"}, - interval = 2, - chance = 22, - action = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "water") ~= 0 and - minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then + interval = 2, + chance = 22, + action = function(pos) + if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "water") ~= 0 + and minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then local i = math.random(-45,45) / 100 minetest.add_entity({x=pos.x + i, y=pos.y - 0.501, z=pos.z + i}, "drippingwater:drop_water") end - end, + end, }) --Create lava drop -minetest.register_abm( - { +minetest.register_abm({ label = "Create lava drops", nodenames = {"group:opaque"}, neighbors = {"group:lava"}, - interval = 2, - chance = 22, - action = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "lava") ~= 0 and - minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then + interval = 2, + chance = 22, + action = function(pos) + if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "lava") ~= 0 + and minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then local i = math.random(-45,45) / 100 minetest.add_entity({x=pos.x + i, y=pos.y - 0.501, z=pos.z + i}, "drippingwater:drop_lava") end - end, -}) + end, +}) \ No newline at end of file From 36f3c26139dabd3e0a902c6a1b5406dc95bf7f0d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:55:14 +0200 Subject: [PATCH 09/38] [walkover] fix warnings --- mods/CORE/walkover/init.lua | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/mods/CORE/walkover/init.lua b/mods/CORE/walkover/init.lua index 220157c8b..6260b43e0 100644 --- a/mods/CORE/walkover/init.lua +++ b/mods/CORE/walkover/init.lua @@ -31,24 +31,21 @@ minetest.register_globalstep(function(dtime) timer = timer + dtime; if timer >= 0.3 then for _,player in pairs(get_connected_players()) do - 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 + 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 - + end + end + end + end timer = 0 end end) From 03c9c0b830c139aa89422032c9a587757d756bde Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:57:42 +0200 Subject: [PATCH 10/38] [mcl_explosion] fix warnings --- mods/CORE/mcl_explosions/init.lua | 11 +++-------- mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr | 2 -- mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr | 2 -- mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr | 2 -- mods/CORE/mcl_explosions/locale/template.txt | 2 -- 5 files changed, 3 insertions(+), 16 deletions(-) delete mode 100644 mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr delete mode 100644 mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr delete mode 100644 mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr delete mode 100644 mods/CORE/mcl_explosions/locale/template.txt diff --git a/mods/CORE/mcl_explosions/init.lua b/mods/CORE/mcl_explosions/init.lua index dfae884cd..3a60f2f37 100644 --- a/mods/CORE/mcl_explosions/init.lua +++ b/mods/CORE/mcl_explosions/init.lua @@ -13,9 +13,7 @@ under the LGPLv2.1 license. mcl_explosions = {} local mod_fire = minetest.get_modpath("mcl_fire") ~= nil -local CONTENT_FIRE = minetest.get_content_id("mcl_fire:fire") - -local S = minetest.get_translator("mcl_explosions") +--local CONTENT_FIRE = minetest.get_content_id("mcl_fire:fire") local hash_node_position = minetest.hash_node_position local get_objects_inside_radius = minetest.get_objects_inside_radius @@ -174,14 +172,11 @@ local function trace_explode(pos, strength, raydirs, radius, info, direct, sourc local ystride = (emax.x - emin_x + 1) local zstride = ystride * (emax.y - emin_y + 1) - local pos_x = pos.x - local pos_y = pos.y - local pos_z = pos.z - local area = VoxelArea:new { + --[[local area = VoxelArea:new { MinEdge = emin, MaxEdge = emax - } + }]] local data = vm:get_data() local destroy = {} diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr deleted file mode 100644 index 4abbc64bf..000000000 --- a/mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:mcl_explosions -@1 was caught in an explosion.=@1 wurde Opfer einer Explosion. diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr deleted file mode 100644 index cb9a0f38e..000000000 --- a/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:mcl_explosions -@1 was caught in an explosion.=@1 a été pris dans une explosion. \ No newline at end of file diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr deleted file mode 100644 index 2c885845f..000000000 --- a/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:mcl_explosions -@1 was caught in an explosion.=@1 не удалось пережить взрыва. diff --git a/mods/CORE/mcl_explosions/locale/template.txt b/mods/CORE/mcl_explosions/locale/template.txt deleted file mode 100644 index 6a9348ddf..000000000 --- a/mods/CORE/mcl_explosions/locale/template.txt +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:mcl_explosions -@1 was caught in an explosion.= From 540508638c400288ed15345b7fa16bdbaf716e6d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:22:25 +0200 Subject: [PATCH 11/38] rewrite flowlib to be more efficient --- mods/CORE/flowlib/init.lua | 144 ++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 73 deletions(-) diff --git a/mods/CORE/flowlib/init.lua b/mods/CORE/flowlib/init.lua index e4e22a20e..ab710e476 100644 --- a/mods/CORE/flowlib/init.lua +++ b/mods/CORE/flowlib/init.lua @@ -1,95 +1,100 @@ +local math = math + +local get_node = minetest.get_node +local get_item_group = minetest.get_item_group + +local registered_nodes = minetest.registered_nodes + flowlib = {} --sum of direction vectors must match an array index + +--(sum,root) +--(0,1), (1,1+0=1), (2,1+1=2), (3,1+2^2=5), (4,2^2+2^2=8) + +local inv_roots = { + [0] = 1, + [1] = 1, + [2] = 0.70710678118655, + [4] = 0.5, + [5] = 0.44721359549996, + [8] = 0.35355339059327, +} + local function to_unit_vector(dir_vector) - --(sum,root) - -- (0,1), (1,1+0=1), (2,1+1=2), (3,1+2^2=5), (4,2^2+2^2=8) - local inv_roots = {[0] = 1, [1] = 1, [2] = 0.70710678118655, [4] = 0.5 - , [5] = 0.44721359549996, [8] = 0.35355339059327} - local sum = dir_vector.x*dir_vector.x + dir_vector.z*dir_vector.z - return {x=dir_vector.x*inv_roots[sum],y=dir_vector.y - ,z=dir_vector.z*inv_roots[sum]} + local sum = dir_vector.x * dir_vector.x + dir_vector.z * dir_vector.z + return {x = dir_vector.x * inv_roots[sum], y = dir_vector.y, z = dir_vector.z * inv_roots[sum]} end -local is_touching = function(realpos,nodepos,radius) +local function is_touching(realpos,nodepos,radius) local boarder = 0.5 - radius - return (math.abs(realpos - nodepos) > (boarder)) + return math.abs(realpos - nodepos) > (boarder) end flowlib.is_touching = is_touching -local is_water = function(pos) - return (minetest.get_item_group(minetest.get_node( - {x=pos.x,y=pos.y,z=pos.z}).name - , "water") ~= 0) +local function is_water(pos) + return get_item_group(get_node(pos).name, "water") ~= 0 end flowlib.is_water = is_water -local node_is_water = function(node) - return (minetest.get_item_group(node.name, "water") ~= 0) +local function node_is_water(node) + return get_item_group(node.name, "water") ~= 0 end flowlib.node_is_water = node_is_water -local is_lava = function(pos) - return (minetest.get_item_group(minetest.get_node( - {x=pos.x,y=pos.y,z=pos.z}).name - , "lava") ~= 0) +local function is_lava(pos) + return get_item_group(get_node(pos).name, "lava") ~= 0 end flowlib.is_lava = is_lava -local node_is_lava = function(node) - return (minetest.get_item_group(node.name, "lava") ~= 0) +local function node_is_lava(node) + return get_item_group(node.name, "lava") ~= 0 end flowlib.node_is_lava = node_is_lava -local is_liquid = function(pos) - return (minetest.get_item_group(minetest.get_node( - {x=pos.x,y=pos.y,z=pos.z}).name - , "liquid") ~= 0) +local function is_liquid(pos) + return get_item_group(get_node(pos).name, "liquid") ~= 0 end flowlib.is_liquid = is_liquid -local node_is_liquid = function(node) - return (minetest.get_item_group(node.name, "liquid") ~= 0) +local function node_is_liquid(node) + return minetest.get_item_group(node.name, "liquid") ~= 0 end flowlib.node_is_liquid = node_is_liquid --This code is more efficient -local function quick_flow_logic(node,pos_testing,direction) +local function quick_flow_logic(node, pos_testing, direction) local name = node.name - if not minetest.registered_nodes[name] then + if not registered_nodes[name] then return 0 end - if minetest.registered_nodes[name].liquidtype == "source" then - local node_testing = minetest.get_node(pos_testing) - local param2_testing = node_testing.param2 - if not minetest.registered_nodes[node_testing.name] then + if registered_nodes[name].liquidtype == "source" then + local node_testing = get_node(pos_testing) + if not registered_nodes[node_testing.name] then return 0 end - if minetest.registered_nodes[node_testing.name].liquidtype - ~= "flowing" then + if registered_nodes[node_testing.name].liquidtype ~= "flowing" then return 0 else return direction end - elseif minetest.registered_nodes[name].liquidtype == "flowing" then - local node_testing = minetest.get_node(pos_testing) + elseif registered_nodes[name].liquidtype == "flowing" then + local node_testing = get_node(pos_testing) local param2_testing = node_testing.param2 - if not minetest.registered_nodes[node_testing.name] then + if not registered_nodes[node_testing.name] then return 0 end - if minetest.registered_nodes[node_testing.name].liquidtype - == "source" then + if registered_nodes[node_testing.name].liquidtype == "source" then return -direction - elseif minetest.registered_nodes[node_testing.name].liquidtype - == "flowing" then + elseif registered_nodes[node_testing.name].liquidtype == "flowing" then if param2_testing < node.param2 then if (node.param2 - param2_testing) > 6 then return -direction @@ -108,48 +113,41 @@ local function quick_flow_logic(node,pos_testing,direction) return 0 end -local quick_flow = function(pos,node) - local x = 0 - local z = 0 - +local function quick_flow(pos, node) if not node_is_liquid(node) then - return {x=0,y=0,z=0} + return {x = 0, y = 0, z = 0} end - - x = x + quick_flow_logic(node,{x=pos.x-1,y=pos.y,z=pos.z},-1) - x = x + quick_flow_logic(node,{x=pos.x+1,y=pos.y,z=pos.z}, 1) - z = z + quick_flow_logic(node,{x=pos.x,y=pos.y,z=pos.z-1},-1) - z = z + quick_flow_logic(node,{x=pos.x,y=pos.y,z=pos.z+1}, 1) - - return to_unit_vector({x=x,y=0,z=z}) + local x = quick_flow_logic(node,{x = pos.x-1, y = pos.y, z = pos.z},-1) + quick_flow_logic(node,{x = pos.x+1, y = pos.y, z = pos.z}, 1) + local z = quick_flow_logic(node,{x = pos.x, y = pos.y, z = pos.z-1},-1) + quick_flow_logic(node,{x = pos.x, y = pos.y, z = pos.z+1}, 1) + return to_unit_vector({x = x, y = 0, z = z}) end flowlib.quick_flow = quick_flow +--if not in water but touching, move centre to touching block +--x has higher precedence than z +--if pos changes with x, it affects z - --if not in water but touching, move centre to touching block - --x has higher precedence than z - --if pos changes with x, it affects z -local move_centre = function(pos,realpos,node,radius) - if is_touching(realpos.x,pos.x,radius) then - if is_liquid({x=pos.x-1,y=pos.y,z=pos.z}) then - node = minetest.get_node({x=pos.x-1,y=pos.y,z=pos.z}) - pos = {x=pos.x-1,y=pos.y,z=pos.z} - elseif is_liquid({x=pos.x+1,y=pos.y,z=pos.z}) then - node = minetest.get_node({x=pos.x+1,y=pos.y,z=pos.z}) - pos = {x=pos.x+1,y=pos.y,z=pos.z} +local function move_centre(pos, realpos, node, radius) + if is_touching(realpos.x, pos.x, radius) then + if is_liquid({x = pos.x-1, y = pos.y, z = pos.z}) then + node = get_node({x=pos.x-1, y = pos.y, z = pos.z}) + pos = {x = pos.x-1, y = pos.y, z = pos.z} + elseif is_liquid({x = pos.x+1, y = pos.y, z = pos.z}) then + node = get_node({x = pos.x+1, y = pos.y, z = pos.z}) + pos = {x = pos.x+1, y = pos.y, z = pos.z} end end - if is_touching(realpos.z,pos.z,radius) then - if is_liquid({x=pos.x,y=pos.y,z=pos.z-1}) then - node = minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1}) - pos = {x=pos.x,y=pos.y,z=pos.z-1} - elseif is_liquid({x=pos.x,y=pos.y,z=pos.z+1}) then - node = minetest.get_node({x=pos.x,y=pos.y,z=pos.z+1}) - pos = {x=pos.x,y=pos.y,z=pos.z+1} + if is_touching(realpos.z, pos.z, radius) then + if is_liquid({x = pos.x, y = pos.y, z = pos.z - 1}) then + node = get_node({x = pos.x, y = pos.y, z = pos.z - 1}) + pos = {x = pos.x, y = pos.y, z = pos.z - 1} + elseif is_liquid({x = pos.x, y = pos.y, z = pos.z + 1}) then + node = get_node({x = pos.x, y = pos.y, z = pos.z + 1}) + pos = {x = pos.x, y = pos.y, z = pos.z + 1} end end - return pos,node + return pos, node end flowlib.move_centre = move_centre From f5a91f7c24520dfd385f8048d215bb271dd36b6e Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:23:41 +0200 Subject: [PATCH 12/38] [biomeinfo] fix warnings --- mods/CORE/biomeinfo/init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/CORE/biomeinfo/init.lua b/mods/CORE/biomeinfo/init.lua index 5013647ed..950925f9d 100644 --- a/mods/CORE/biomeinfo/init.lua +++ b/mods/CORE/biomeinfo/init.lua @@ -81,11 +81,11 @@ if v6_use_snow_biomes then end local v6_freq_desert = tonumber(minetest.get_mapgen_setting("mgv6_freq_desert") or 0.45) -local NOISE_MAGIC_X = 1619 -local NOISE_MAGIC_Y = 31337 -local NOISE_MAGIC_Z = 52591 -local NOISE_MAGIC_SEED = 1013 -local noise2d = function(x, y, seed) +--local NOISE_MAGIC_X = 1619 +--local NOISE_MAGIC_Y = 31337 +--local NOISE_MAGIC_Z = 52591 +--local NOISE_MAGIC_SEED = 1013 +local function noise2d(x, y, seed) -- TODO: implement noise2d function for biome blend return 0 --[[ From f61102279f6aff046ed203a1370ef576c4a910a7 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:26:26 +0200 Subject: [PATCH 13/38] [_mcl_autogroup] fix warnings --- mods/CORE/_mcl_autogroup/init.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mods/CORE/_mcl_autogroup/init.lua b/mods/CORE/_mcl_autogroup/init.lua index c8475d0bd..e6b3aa2d0 100644 --- a/mods/CORE/_mcl_autogroup/init.lua +++ b/mods/CORE/_mcl_autogroup/init.lua @@ -121,7 +121,7 @@ local hardness_values = get_hardness_values_for_groups() -- hardness_value. Used for quick lookup. local hardness_lookup = get_hardness_lookup_for_groups(hardness_values) -local function compute_creativetimes(group) +--[[local function compute_creativetimes(group) local creativetimes = {} for index, hardness in pairs(hardness_values[group]) do @@ -129,7 +129,7 @@ local function compute_creativetimes(group) end return creativetimes -end +end]] -- Get the list of digging times for using a specific tool on a specific -- diggroup. @@ -239,13 +239,13 @@ function mcl_autogroup.can_harvest(nodename, toolname) end -- Get one groupcap field for using a specific tool on a specific group. -local function get_groupcap(group, can_harvest, multiplier, efficiency, uses) +--[[local function get_groupcap(group, can_harvest, multiplier, efficiency, uses) return { times = get_digtimes(group, can_harvest, multiplier, efficiency), uses = uses, maxlevel = 0, } -end +end]] -- Returns the tool_capabilities from a tool definition or a default set of -- tool_capabilities @@ -271,7 +271,7 @@ end -- toolname - Name of the tool being enchanted (like "mcl_tools:diamond_pickaxe") -- efficiency - The efficiency level the tool is enchanted with (default 0) -- --- NOTE: +-- NOTE: -- This function can only be called after mod initialization. Otherwise a mod -- would have to add _mcl_autogroup as a dependency which would break the mod -- loading order. @@ -288,7 +288,7 @@ end -- toolname - Name of the tool used -- diggroup - The name of the diggroup the tool is used on -- --- NOTE: +-- NOTE: -- This function can only be called after mod initialization. Otherwise a mod -- would have to add _mcl_autogroup as a dependency which would break the mod -- loading order. @@ -315,12 +315,12 @@ local overwrite = function() newgroups.opaque = 1 end - local creative_breakable = false + --local creative_breakable = false -- Assign groups used for digging this node depending on -- the registered digging groups for g, gdef in pairs(mcl_autogroup.registered_diggroups) do - creative_breakable = true + --creative_breakable = true local index = hardness_lookup[g][ndef._mcl_hardness or 0] if ndef.groups[g] then if gdef.levels then From 0cc11d0bbb1f8c6acf98476c2908026af462ddaf Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:28:10 +0200 Subject: [PATCH 14/38] [mcl_loot] fix warnings --- mods/CORE/mcl_loot/init.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/CORE/mcl_loot/init.lua b/mods/CORE/mcl_loot/init.lua index 6db743740..1b2c50807 100644 --- a/mods/CORE/mcl_loot/init.lua +++ b/mods/CORE/mcl_loot/init.lua @@ -40,10 +40,9 @@ function mcl_loot.get_loot(loot_definitions, pr) total_weight = total_weight + (loot_definitions.items[i].weight or 1) end - local stacks_min = loot_definitions.stacks_min - local stacks_max = loot_definitions.stacks_max - if not stacks_min then stacks_min = 1 end - if not stacks_max then stacks_max = 1 end + --local stacks_min = loot_definitions.stacks_min or 1 + --local stacks_max = loot_definitions.stacks_max or 1 + local stacks = pr:next(loot_definitions.stacks_min, loot_definitions.stacks_max) for s=1, stacks do local r = pr:next(1, total_weight) From 00f4cfa5b5216bfcfe41f11598ccf2f968c4262f Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:33:26 +0200 Subject: [PATCH 15/38] simplify mcl_util code --- mods/CORE/mcl_util/init.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 1bf3add38..0168229f2 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -457,9 +457,7 @@ function mcl_util.calculate_durability(itemstack) end end if not uses then - local toolcaps = itemstack:get_tool_capabilities() - local groupcaps = toolcaps.groupcaps - for _, v in pairs(groupcaps) do + for _, v in pairs(itemstack:get_tool_capabilities().groupcaps) do uses = v.uses break end From 79cf98c8e30be6026eea09bfa8401243149fae8f Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:48:14 +0200 Subject: [PATCH 16/38] [mcl_mobs] fix some warnings --- mods/ENTITIES/mcl_mobs/api/api.lua | 154 ++++++++++++----------------- mods/ENTITIES/mcl_mobs/mod.conf | 2 +- 2 files changed, 65 insertions(+), 91 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 878474cf1..41b522fef 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -11,133 +11,111 @@ local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius local minetest_get_modpath = minetest.get_modpath local minetest_registered_nodes = minetest.registered_nodes local minetest_get_node = minetest.get_node -local minetest_get_item_group = minetest.get_item_group +--local minetest_get_item_group = minetest.get_item_group local minetest_registered_entities = minetest.registered_entities -local minetest_line_of_sight = minetest.line_of_sight -local minetest_after = minetest.after -local minetest_sound_play = minetest.sound_play -local minetest_add_particlespawner = minetest.add_particlespawner -local minetest_registered_items = minetest.registered_items -local minetest_set_node = minetest.set_node +--local minetest_line_of_sight = minetest.line_of_sight +--local minetest_after = minetest.after +--local minetest_sound_play = minetest.sound_play +--local minetest_add_particlespawner = minetest.add_particlespawner +--local minetest_registered_items = minetest.registered_items +--local minetest_set_node = minetest.set_node local minetest_add_item = minetest.add_item -local minetest_get_craft_result = minetest.get_craft_result -local minetest_find_path = minetest.find_path -local minetest_is_protected = minetest.is_protected +--local minetest_get_craft_result = minetest.get_craft_result +--local minetest_find_path = minetest.find_path local minetest_is_creative_enabled = minetest.is_creative_enabled -local minetest_find_node_near = minetest.find_node_near -local minetest_find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air -local minetest_raycast = minetest.raycast -local minetest_get_us_time = minetest.get_us_time +--local minetest_find_node_near = minetest.find_node_near +--local minetest_find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air +--local minetest_raycast = minetest.raycast +--local minetest_get_us_time = minetest.get_us_time local minetest_add_entity = minetest.add_entity -local minetest_get_natural_light = minetest.get_natural_light -local minetest_get_node_or_nil = minetest.get_node_or_nil +--local minetest_get_natural_light = minetest.get_natural_light +--local minetest_get_node_or_nil = minetest.get_node_or_nil -- localize math functions -local math_pi = math.pi -local math_sin = math.sin -local math_cos = math.cos -local math_abs = math.abs -local math_min = math.min -local math_max = math.max -local math_atan = math.atan -local math_random = math.random -local math_floor = math.floor +local math = math -- localize vector functions -local vector_new = vector.new -local vector_add = vector.add -local vector_length = vector.length -local vector_direction = vector.direction -local vector_normalize = vector.normalize -local vector_multiply = vector.multiply -local vector_divide = vector.divide +local vector = vector + +local string = string -- mob constants -local BREED_TIME = 30 -local BREED_TIME_AGAIN = 300 -local CHILD_GROW_TIME = 60*20 -local DEATH_DELAY = 0.5 +--local BREED_TIME = 30 +--local BREED_TIME_AGAIN = 300 +--local CHILD_GROW_TIME = 60*20 +--local DEATH_DELAY = 0.5 local DEFAULT_FALL_SPEED = -10 -local FLOP_HEIGHT = 5.0 -local FLOP_HOR_SPEED = 1.5 +--local FLOP_HEIGHT = 5.0 +--local FLOP_HOR_SPEED = 1.5 local GRAVITY = minetest_settings:get("movement_gravity")-- + 9.81 +local MAX_MOB_NAME_LENGTH = 30 -local MOB_CAP = {} + +--[[local MOB_CAP = {} MOB_CAP.hostile = 70 MOB_CAP.passive = 10 MOB_CAP.ambient = 15 MOB_CAP.water = 15 +]] -- Load main settings -local damage_enabled = minetest_settings:get_bool("enable_damage") -local disable_blood = minetest_settings:get_bool("mobs_disable_blood") -local mobs_drop_items = minetest_settings:get_bool("mobs_drop_items") ~= false -local mobs_griefing = minetest_settings:get_bool("mobs_griefing") ~= false -local spawn_protected = minetest_settings:get_bool("mobs_spawn_protected") ~= false -local remove_far = true +--local damage_enabled = minetest_settings:get_bool("enable_damage") +--local disable_blood = minetest_settings:get_bool("mobs_disable_blood") +--local mobs_drop_items = minetest_settings:get_bool("mobs_drop_items") ~= false +--local mobs_griefing = minetest_settings:get_bool("mobs_griefing") ~= false +--local spawn_protected = minetest_settings:get_bool("mobs_spawn_protected") ~= false +--local remove_far = true local difficulty = tonumber(minetest_settings:get("mob_difficulty")) or 1.0 -local show_health = false -local max_per_block = tonumber(minetest_settings:get("max_objects_per_block") or 64) -local mobs_spawn_chance = tonumber(minetest_settings:get("mobs_spawn_chance") or 2.5) +--local show_health = false +--local max_per_block = tonumber(minetest_settings:get("max_objects_per_block") or 64) +---local mobs_spawn_chance = tonumber(minetest_settings:get("mobs_spawn_chance") or 2.5) -- pathfinding settings -local enable_pathfinding = true -local stuck_timeout = 3 -- how long before mob gets stuck in place and starts searching -local stuck_path_timeout = 10 -- how long will mob follow path before giving up +--local enable_pathfinding = true +--local stuck_timeout = 3 -- how long before mob gets stuck in place and starts searching +--local stuck_path_timeout = 10 -- how long will mob follow path before giving up -- default nodes -local node_ice = "mcl_core:ice" -local node_snowblock = "mcl_core:snowblock" -local node_snow = "mcl_core:snow" +--local node_ice = "mcl_core:ice" +--local node_snowblock = "mcl_core:snowblock" +--local node_snow = "mcl_core:snow" mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt" -local mod_weather = minetest_get_modpath("mcl_weather") -local mod_explosions = minetest_get_modpath("mcl_explosions") +--local mod_weather = minetest_get_modpath("mcl_weather") +--local mod_explosions = minetest_get_modpath("mcl_explosions") local mod_mobspawners = minetest_get_modpath("mcl_mobspawners") -local mod_hunger = minetest_get_modpath("mcl_hunger") -local mod_worlds = minetest_get_modpath("mcl_worlds") -local mod_armor = minetest_get_modpath("mcl_armor") -local mod_experience = minetest_get_modpath("mcl_experience") +--local mod_hunger = minetest_get_modpath("mcl_hunger") +--local mod_worlds = minetest_get_modpath("mcl_worlds") +--local mod_armor = minetest_get_modpath("mcl_armor") +--local mod_experience = minetest_get_modpath("mcl_experience") -- random locals I found -local los_switcher = false -local height_switcher = false +--local los_switcher = false +--local height_switcher = false -- Get translator local S = minetest.get_translator("mcl_mobs") -- CMI support check -local use_cmi = minetest.global_exists("cmi") - - --- Invisibility mod check -mobs.invis = {} -if minetest.global_exists("invisibility") then - mobs.invis = invisibility -end - +--local use_cmi = minetest.global_exists("cmi") -- creative check function mobs.is_creative(name) return minetest_is_creative_enabled(name) end - -local atan = function(x) +--[[local function atan(x) if not x or x ~= x then return 0 else - return math_atan(x) + return math.atan(x) end -end - - - +end]] -- Shows helpful debug info above each mob -local mobs_debug = minetest_settings:get_bool("mobs_debug", false) +--local mobs_debug = minetest_settings:get_bool("mobs_debug", false) -- Peaceful mode message so players will know there are no monsters if minetest_settings:get_bool("only_peaceful_mobs", false) then @@ -191,7 +169,7 @@ function mobs:register_mob(name, def) if (not value) or (value == default) or (value == special) then return default else - return math_max(min, value * difficulty) + return math.max(min, value * difficulty) end end @@ -366,15 +344,11 @@ function mobs:register_mob(name, def) random_sound_timer_min = 3, random_sound_timer_max = 10, - --head code variables --defaults are for the cow's default --because I don't know what else to set them --to :P - has_head = def.has_head or false, - head_bone = def.head_bone, - --you must use these to adjust the mob's head positions --has_head is used as a logic gate (quick easy check) @@ -444,7 +418,7 @@ function mobs:register_mob(name, def) --on_detach_child = mob_detach_child, on_activate = function(self, staticdata, dtime) - self.object:set_acceleration(vector_new(0,-GRAVITY, 0)) + self.object:set_acceleration(vector.new(0,-GRAVITY, 0)) return mobs.mob_activate(self, staticdata, def, dtime) end, @@ -556,10 +530,10 @@ function mobs:register_arrow(name, def) and def.tail_texture then --do this to prevent clipping through main entity sprite - local pos_adjustment = vector_multiply(vector_normalize(vel), -1) + local pos_adjustment = vector.multiply(vector.normalize(vel), -1) local divider = def.tail_distance_divider or 1 - pos_adjustment = vector_divide(pos_adjustment, divider) - local new_pos = vector_add(pos, pos_adjustment) + pos_adjustment = vector.divide(pos_adjustment, divider) + local new_pos = vector.add(pos, pos_adjustment) minetest.add_particle({ pos = new_pos, velocity = {x = 0, y = 0, z = 0}, @@ -693,12 +667,12 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) if pos --and within_limits(pos, 0) - and not minetest_is_protected(pos, placer:get_player_name()) then + and not minetest.is_protected(pos, placer:get_player_name()) then local name = placer:get_player_name() local privs = minetest.get_player_privs(name) if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then - if minetest_is_protected(pointed_thing.under, name) then + if minetest.is_protected(pointed_thing.under, name) then minetest.record_protection_violation(pointed_thing.under, name) return itemstack end diff --git a/mods/ENTITIES/mcl_mobs/mod.conf b/mods/ENTITIES/mcl_mobs/mod.conf index 9dfb43aef..2a91a7764 100644 --- a/mods/ENTITIES/mcl_mobs/mod.conf +++ b/mods/ENTITIES/mcl_mobs/mod.conf @@ -2,4 +2,4 @@ name = mcl_mobs author = PilzAdam description = Adds a mob API for mods to add animals or monsters, etc. depends = mcl_particles -optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, invisibility, cmi, doc_identifier, mcl_armor, mcl_portals, mcl_experience +optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, cmi, doc_identifier, mcl_armor, mcl_portals, mcl_experience From d3a237384dc5c614733799b2f93ad19343777529 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 08:40:21 +0200 Subject: [PATCH 17/38] [mcl_end] fix warnings --- mods/ITEMS/mcl_end/chorus_plant.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index b54259885..0e35ff286 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -450,6 +450,8 @@ function mcl_end.grow_chorus_plant_step(pos, node, pr) end --- ABM --- +local seed = minetest.get_mapgen_params().seed +local pr = PseudoRandom(seed) minetest.register_abm({ label = "Chorus plant growth", nodenames = { "mcl_end:chorus_flower" }, From 8592670f9b0592e1e1eaf26730cbf9dc99757904 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 08:44:24 +0200 Subject: [PATCH 18/38] [tsm_railcorridors] fix warnings --- mods/MAPGEN/tsm_railcorridors/init.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 2414cc962..550167dc3 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -114,7 +114,8 @@ if not tsm_railcorridors.nodes.corridor_woods_function then end -- Random Perlin noise generators -local pr, pr_carts, pr_treasures, pr_deco, webperlin_major, webperlin_minor +local pr, pr_carts, pr_deco, webperlin_major, webperlin_minor +--local pr_treasures local function InitRandomizer(seed) -- Mostly used for corridor gen. @@ -124,7 +125,7 @@ local function InitRandomizer(seed) -- Separate randomizer for carts because spawning carts is very timing-dependent pr_carts = PseudoRandom(seed-654) -- Chest contents randomizer - pr_treasures = PseudoRandom(seed+777) + --pr_treasures = PseudoRandom(seed+777) -- Used for cobweb generation, both noises have to reach a high value for cobwebs to appear webperlin_major = PerlinNoise(934, 3, 0.6, 500) webperlin_minor = PerlinNoise(834, 3, 0.6, 50) From 42d3830c4820fe6f22ff42b271d05d5b42296dd3 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 08:49:46 +0200 Subject: [PATCH 19/38] [mcl_nether] fix warnings --- mods/ITEMS/mcl_nether/lava.lua | 10 +--------- mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr | 2 -- mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr | 4 +--- mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr | 2 -- mods/ITEMS/mcl_nether/locale/template.txt | 4 +--- 5 files changed, 3 insertions(+), 19 deletions(-) diff --git a/mods/ITEMS/mcl_nether/lava.lua b/mods/ITEMS/mcl_nether/lava.lua index da85b8e3c..035a50322 100644 --- a/mods/ITEMS/mcl_nether/lava.lua +++ b/mods/ITEMS/mcl_nether/lava.lua @@ -1,12 +1,6 @@ -- Lava in the Nether -local S = minetest.get_translator("mcl_nether") -local N = function(s) return s end - -local msg = { - N("@1 has become one with the lava."), - N("@1 has been consumed by the lava."), -} +local S = minetest.get_translator(minetest.get_current_modname()) -- TODO: Increase flow speed. This could be done by reducing viscosity, -- but this would also allow players to swim faster in lava. @@ -20,7 +14,6 @@ lava_src_def._doc_items_usagehelp = nil lava_src_def.liquid_range = 7 lava_src_def.liquid_alternative_source = "mcl_nether:nether_lava_source" lava_src_def.liquid_alternative_flowing = "mcl_nether:nether_lava_flowing" -lava_src_def._mcl_node_death_message = msg, minetest.register_node("mcl_nether:nether_lava_source", lava_src_def) local lava_flow_def = table.copy(minetest.registered_nodes["mcl_core:lava_flowing"]) @@ -29,7 +22,6 @@ lava_flow_def._doc_items_create_entry = false lava_flow_def.liquid_range = 7 lava_flow_def.liquid_alternative_flowing = "mcl_nether:nether_lava_flowing" lava_flow_def.liquid_alternative_source = "mcl_nether:nether_lava_source" -lava_flow_def._mcl_node_death_message = msg, minetest.register_node("mcl_nether:nether_lava_flowing", lava_flow_def) -- Add entry aliases for the Help diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr index bfa62488c..f81f381e2 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr @@ -38,5 +38,3 @@ Place this item on soul sand to plant it and watch it grow.=Platzieren Sie den G Burns your feet=Verbrennt Ihre Füße Grows on soul sand=Wächst auf Seelensand Reduces walking speed=Reduziert das Schritttempo -@1 has become one with the lava.=@1 wurde eins mit der Lava. -@1 has been consumed by the lava.=@1 wurde von der Lava verzehrt. diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr index 11a046374..3e3583355 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr @@ -37,6 +37,4 @@ Nether warts are plants home to the Nether. They can be planted on soul sand and Place this item on soul sand to plant it and watch it grow.=Placez cet article sur du sable d'âme pour le planter et regardez-le grandir. Burns your feet=Vous brûle les pieds Grows on soul sand=Pousse sur le sable de l'âme -Reduces walking speed=Réduit la vitesse de marche -@1 has become one with the lava.=@1 est devenu un avec la lave. -@1 has been consumed by the lava.=@1 a été consumé par la lave. \ No newline at end of file +Reduces walking speed=Réduit la vitesse de marche \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr index 2cfdd370b..f546d16ca 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr @@ -38,5 +38,3 @@ Place this item on soul sand to plant it and watch it grow.=Поместите Burns your feet=Обжигает ваши ноги Grows on soul sand=Растёт на песке душ Reduces walking speed=Уменьшает скорость ходьбы -@1 has become one with the lava.=@1 породнился(лась) с лавой. -@1 has been consumed by the lava.=@1 был(а) поглощен(а) лавой. diff --git a/mods/ITEMS/mcl_nether/locale/template.txt b/mods/ITEMS/mcl_nether/locale/template.txt index 7b5052166..0e69ad520 100644 --- a/mods/ITEMS/mcl_nether/locale/template.txt +++ b/mods/ITEMS/mcl_nether/locale/template.txt @@ -37,6 +37,4 @@ Nether warts are plants home to the Nether. They can be planted on soul sand and Place this item on soul sand to plant it and watch it grow.= Burns your feet= Grows on soul sand= -Reduces walking speed= -@1 has become one with the lava.= -@1 has been consumed by the lava.= +Reduces walking speed= \ No newline at end of file From 3f3abbbee11f0f80997886f4c131c1f61aeac7d3 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 09:09:16 +0200 Subject: [PATCH 20/38] speedup mcl_particles code --- mods/CORE/mcl_particles/init.lua | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/mods/CORE/mcl_particles/init.lua b/mods/CORE/mcl_particles/init.lua index 48e9db8df..4854afd54 100644 --- a/mods/CORE/mcl_particles/init.lua +++ b/mods/CORE/mcl_particles/init.lua @@ -1,3 +1,12 @@ +local vector = vector +local table = table + +local hash_node_position = minetest.hash_node_position +local add_particlespawner = minetest.add_particlespawner +local delete_particlespawner = minetest.delete_particlespawner + +local ipairs = ipairs + mcl_particles = {} -- Table of particlespawner IDs on a per-node hash basis @@ -32,11 +41,11 @@ function mcl_particles.add_node_particlespawner(pos, particlespawner_definition, if allowed_level == 0 or levels[level] > allowed_level then return end - local poshash = minetest.hash_node_position(pos) + local poshash = hash_node_position(pos) if not poshash then return end - local id = minetest.add_particlespawner(particlespawner_definition) + local id = add_particlespawner(particlespawner_definition) if id == -1 then return end @@ -47,6 +56,8 @@ function mcl_particles.add_node_particlespawner(pos, particlespawner_definition, return id end +local add_node_particlespawner = mcl_particles.add_node_particlespawner + -- Deletes all particlespawners that are assigned to a node position. -- If no particlespawners exist for this position, nothing happens. -- pos: Node positon. MUST use integer values! @@ -55,11 +66,11 @@ function mcl_particles.delete_node_particlespawners(pos) if allowed_level == 0 then return false end - local poshash = minetest.hash_node_position(pos) + local poshash = hash_node_position(pos) local ids = particle_nodes[poshash] if ids then for i=1, #ids do - minetest.delete_particlespawner(ids[i]) + delete_particlespawner(ids[i]) end particle_nodes[poshash] = nil return true @@ -72,7 +83,6 @@ end local smoke_pdef_cached = {} function mcl_particles.spawn_smoke(pos, name, smoke_pdef_base) - local min = math.min local new_minpos = vector.add(pos, smoke_pdef_base.minrelpos) local new_maxpos = vector.add(pos, smoke_pdef_base.maxrelpos) @@ -81,7 +91,7 @@ function mcl_particles.spawn_smoke(pos, name, smoke_pdef_base) for i, smoke_pdef in ipairs(smoke_pdef_cached[name]) do smoke_pdef.minpos = new_minpos smoke_pdef.maxpos = new_maxpos - mcl_particles.add_node_particlespawner(pos, smoke_pdef, "high") + add_node_particlespawner(pos, smoke_pdef, "high") end -- cache already populated else @@ -111,13 +121,11 @@ function mcl_particles.spawn_smoke(pos, name, smoke_pdef_base) smoke_pdef.animation.length = exptime + 0.1 -- minexptime must be set such that the last frame is actully rendered, -- even if its very short. Larger exptime -> larger range - smoke_pdef.minexptime = min(exptime, (7.0/8.0 * (exptime + 0.1) + 0.1)) + smoke_pdef.minexptime = math.min(exptime, (7.0/8.0 * (exptime + 0.1) + 0.1)) smoke_pdef.texture = "mcl_particles_smoke_anim.png^[colorize:#000000:" ..colorize - - mcl_particles.add_node_particlespawner(pos, smoke_pdef, "high") - + add_node_particlespawner(pos, smoke_pdef, "high") table.insert(smoke_pdef_cached[name], table.copy(smoke_pdef)) end end end -end +end \ No newline at end of file From 981f3d5d74ed49a9748cee3d168c8626bab1fd61 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 10:51:46 +0200 Subject: [PATCH 21/38] fix some codestyle issues --- mods/CORE/mcl_worlds/init.lua | 62 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/mods/CORE/mcl_worlds/init.lua b/mods/CORE/mcl_worlds/init.lua index 435ce51c7..ec8144794 100644 --- a/mods/CORE/mcl_worlds/init.lua +++ b/mods/CORE/mcl_worlds/init.lua @@ -33,15 +33,15 @@ end -- If the Y coordinate is not located in any dimension, it will return: -- nil, "void" function mcl_worlds.y_to_layer(y) - if y >= mcl_vars.mg_overworld_min then - return y - mcl_vars.mg_overworld_min, "overworld" - elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max+128 then - return y - mcl_vars.mg_nether_min, "nether" - elseif y >= mcl_vars.mg_end_min and y <= mcl_vars.mg_end_max then - return y - mcl_vars.mg_end_min, "end" - else - return nil, "void" - end + if y >= mcl_vars.mg_overworld_min then + return y - mcl_vars.mg_overworld_min, "overworld" + elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max+128 then + return y - mcl_vars.mg_nether_min, "nether" + elseif y >= mcl_vars.mg_end_min and y <= mcl_vars.mg_end_max then + return y - mcl_vars.mg_end_min, "end" + else + return nil, "void" + end end -- Takes a pos and returns the dimension it belongs to (same as above) @@ -55,38 +55,38 @@ end -- MineClone 2. -- mc_dimension is one of "overworld", "nether", "end" (default: "overworld"). function mcl_worlds.layer_to_y(layer, mc_dimension) - if mc_dimension == "overworld" or mc_dimension == nil then - return layer + mcl_vars.mg_overworld_min - elseif mc_dimension == "nether" then - return layer + mcl_vars.mg_nether_min - elseif mc_dimension == "end" then - return layer + mcl_vars.mg_end_min - end + if mc_dimension == "overworld" or mc_dimension == nil then + return layer + mcl_vars.mg_overworld_min + elseif mc_dimension == "nether" then + return layer + mcl_vars.mg_nether_min + elseif mc_dimension == "end" then + return layer + mcl_vars.mg_end_min + end end -- Takes a position and returns true if this position can have weather function mcl_worlds.has_weather(pos) - -- Weather in the Overworld and the high part of the void below - return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 + -- Weather in the Overworld and the high part of the void below + return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 end -- Takes a position and returns true if this position can have Nether dust function mcl_worlds.has_dust(pos) - -- Weather in the Overworld and the high part of the void below - return pos.y <= mcl_vars.mg_nether_max + 138 and pos.y >= mcl_vars.mg_nether_min - 10 + -- Weather in the Overworld and the high part of the void below + return pos.y <= mcl_vars.mg_nether_max + 138 and pos.y >= mcl_vars.mg_nether_min - 10 end -- Takes a position (pos) and returns true if compasses are working here function mcl_worlds.compass_works(pos) - -- It doesn't work in Nether and the End, but it works in the Overworld and in the high part of the void below - local _, dim = mcl_worlds.y_to_layer(pos.y) - if dim == "nether" or dim == "end" then - return false - elseif dim == "void" then - return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 - else - return true - end + -- It doesn't work in Nether and the End, but it works in the Overworld and in the high part of the void below + local _, dim = mcl_worlds.y_to_layer(pos.y) + if dim == "nether" or dim == "end" then + return false + elseif dim == "void" then + return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 + else + return true + end end -- Takes a position (pos) and returns true if clocks are working here @@ -112,11 +112,11 @@ local last_dimension = {} -- * player: Player who changed the dimension -- * dimension: New dimension ("overworld", "nether", "end", "void") function mcl_worlds.dimension_change(player, dimension) - local playername = player:get_player_name() + local playername = player:get_player_name() for i=1, #mcl_worlds.registered_on_dimension_change do mcl_worlds.registered_on_dimension_change[i](player, dimension, last_dimension[playername]) end - last_dimension[playername] = dimension + last_dimension[playername] = dimension end ----------------------- INTERNAL STUFF ---------------------- From 388ab6d8dffea8c7daa5760e962ee0ebf3cbaeb1 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 10:56:06 +0200 Subject: [PATCH 22/38] fix some codestyle issues --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 4 ++-- .../mcl_mobs/api/mob_functions/animation.lua | 2 +- .../mcl_mobs/api/mob_functions/breeding.lua | 4 +--- .../mcl_mobs/api/mob_functions/environment.lua | 16 +++++++--------- .../mcl_mobs/api/mob_functions/head_logic.lua | 2 +- .../mcl_mobs/api/mob_functions/movement.lua | 2 +- mods/ENTITIES/mcl_mobs/api/spawning.lua | 2 +- mods/HUD/mcl_experience/init.lua | 6 +++--- mods/ITEMS/mcl_enchanting/engine.lua | 2 +- mods/MAPGEN/mcl_structures/init.lua | 2 +- mods/MAPGEN/mcl_villages/buildings.lua | 4 ++-- mods/PLAYER/mcl_playerplus/init.lua | 2 +- 12 files changed, 22 insertions(+), 26 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index df2ccade2..ef2687455 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -416,7 +416,7 @@ local swim_turn_check = function(self,dtime) local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - return(green_flag_1) + return green_flag_1 end --this is to swap the built in engine acceleration modifier @@ -561,7 +561,7 @@ local fly_turn_check = function(self,dtime) local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - return(green_flag_1) + return green_flag_1 end --this is to swap the built in engine acceleration modifier diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index 8f2ea9e31..cea6d838b 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -157,7 +157,7 @@ local calculate_pitch = function(self) return false end - return(minetest_dir_to_yaw(vector_new(vector_distance(vector_new(pos.x,0,pos.z),vector_new(pos2.x,0,pos2.z)),0,pos.y - pos2.y)) + HALF_PI) + return minetest_dir_to_yaw(vector_new(vector_distance(vector_new(pos.x,0,pos.z),vector_new(pos2.x,0,pos2.z)),0,pos.y - pos2.y)) + HALF_PI end --this is a helper function used to make mobs pitch rotation dynamically flow when flying/swimming diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua index 57650a9c9..c50fb6300 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua @@ -140,9 +140,7 @@ mobs.look_for_mate = function(self) winner_mate = mate end end - - return(winner_mate) - + return winner_mate end --make the baby grow up diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index 3b204a4bf..5c431135e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -76,8 +76,7 @@ mobs.detect_closest_player_within_radius = function(self, line_of_sight, radius, winner_player = player end end - - return(winner_player) + return winner_player end @@ -104,14 +103,13 @@ mobs.jump_check = function(self,dtime) if green_flag_1 and green_flag_2 then --can jump over node - return(1) + return 1 elseif green_flag_1 and not green_flag_2 then --wall in front of mob - return(2) + return 2 end - --nothing to jump over - return(0) + return 0 end -- a helper function to quickly turn neutral passive mobs hostile @@ -223,12 +221,12 @@ mobs.check_for_player_within_area = function(self, radius) local distance = vector_distance(pos1,pos2) if distance < radius then --found a player - return(true) + return true end end end --did not find a player - return(false) + return false end @@ -236,7 +234,7 @@ end mobs.get_2d_distance = function(pos1,pos2) pos1.y = 0 pos2.y = 0 - return(vector_distance(pos1, pos2)) + return vector_distance(pos1, pos2) end -- fall damage onto solid ground diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua index 13bc6584d..0f5615504 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua @@ -3,7 +3,7 @@ local vector = vector --converts yaw to degrees local degrees = function(yaw) - return(yaw*180.0/math.pi) + return yaw*180.0/math.pi end mobs.do_head_logic = function(self,dtime) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 72612b1eb..893f8eede 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -312,7 +312,7 @@ mobs.calculate_pitch = function(pos1, pos2) return false end - return(minetest_dir_to_yaw(vector.new(vector.distance(vector.new(pos1.x,0,pos1.z),vector.new(pos2.x,0,pos2.z)),0,pos1.y - pos2.y)) + HALF_PI) + return minetest_dir_to_yaw(vector.new(vector.distance(vector.new(pos1.x,0,pos1.z),vector.new(pos2.x,0,pos2.z)),0,pos1.y - pos2.y)) + HALF_PI end --make mobs fly up or down based on their y difference diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index 08b161527..bf7176b99 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -501,7 +501,7 @@ local position_calculation = function(pos) pos.z = pos.z + math_random(inner,outer)*int[math_random(1,2)] pos.x = pos.x + math_random(-outer,outer) end - return(pos) + return pos end --[[ diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index 53376c63f..a40599d17 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -120,9 +120,9 @@ end hud_manager.hud_exists = function(player,hud_name) local name = player:get_player_name() if player_huds[name] and player_huds[name][hud_name] then - return(true) + return true else - return(false) + return false end end ------------------- @@ -150,7 +150,7 @@ end) function mcl_experience.get_player_xp_level(player) local name = player:get_player_name() - return(pool[name].level) + return pool[name].level end function mcl_experience.set_player_xp_level(player,level) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index 47db36870..d2db2281a 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -7,7 +7,7 @@ end function mcl_enchanting.get_enchantments(itemstack) if not itemstack then - return({}) + return {} end return minetest.deserialize(itemstack:get_meta():get_string("mcl_enchanting:enchantments")) or {} end diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index e3f6b4829..f939b9c1a 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -15,7 +15,7 @@ local function ecb_place(blockpos, action, calls_remaining, param) end end mcl_structures.place_schematic = function(pos, schematic, rotation, replacements, force_placement, flags, after_placement_callback, pr, callback_param) - local s = loadstring(minetest.serialize_schematic(schematic, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return(schematic)")() + local s = loadstring(minetest.serialize_schematic(schematic, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic")() if s and s.size then local x, z = s.size.x, s.size.z if rotation then diff --git a/mods/MAPGEN/mcl_villages/buildings.lua b/mods/MAPGEN/mcl_villages/buildings.lua index 9d8e7580f..3f4490bf9 100644 --- a/mods/MAPGEN/mcl_villages/buildings.lua +++ b/mods/MAPGEN/mcl_villages/buildings.lua @@ -14,7 +14,7 @@ function settlements.build_schematic(vm, data, va, pos, building, replace_wall, -- schematic conversion to lua local schem_lua = minetest.serialize_schematic(building, "lua", - {lua_use_comments = false, lua_num_indent_spaces = 0}).." return(schematic)" + {lua_use_comments = false, lua_num_indent_spaces = 0}).." return schematic" -- replace material if replace_wall == "y" then schem_lua = schem_lua:gsub("mcl_core:cobble", material) @@ -228,7 +228,7 @@ function settlements.place_schematics(settlement_info, pr) -- schematic conversion to lua local schem_lua = minetest.serialize_schematic(building, "lua", - {lua_use_comments = false, lua_num_indent_spaces = 0}).." return(schematic)" + {lua_use_comments = false, lua_num_indent_spaces = 0}).." return schematic" schem_lua = schem_lua:gsub("mcl_core:stonebrickcarved", "mcl_villages:stonebrickcarved") -- replace material if replace_wall then diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 3ad6ba6e8..40752b835 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -49,7 +49,7 @@ local player_collision = function(player) end end - return({x,z}) + return {x,z} end -- converts yaw to degrees From 9e074af07f542adfadbc3e16456571b31579309e Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 12:52:25 +0200 Subject: [PATCH 23/38] unify code style [1] --- CONTRIBUTING.md | 2 +- mods/CORE/_mcl_autogroup/init.lua | 2 +- mods/CORE/mcl_attached/init.lua | 21 ++++--- mods/CORE/mcl_util/init.lua | 4 +- mods/ENTITIES/mcl_item_entity/init.lua | 12 ++-- mods/ENTITIES/mcl_minecarts/init.lua | 4 +- mods/ENTITIES/mcl_minecarts/rails.lua | 2 +- .../mcl_mobs/api/mob_functions/ai.lua | 28 ++++----- mods/ENTITIES/mcl_mobs/api/spawning.lua | 8 +-- mods/ITEMS/REDSTONE/mesecons/presets.lua | 4 +- mods/ITEMS/REDSTONE/mesecons/services.lua | 6 +- mods/ITEMS/REDSTONE/mesecons_button/init.lua | 2 +- mods/ITEMS/mcl_fences/init.lua | 4 +- mods/ITEMS/mcl_fire/init.lua | 2 +- mods/ITEMS/mcl_fishing/init.lua | 11 ++-- mods/ITEMS/xpanes/init.lua | 2 +- mods/MAPGEN/mcl_biomes/init.lua | 8 +-- mods/MAPGEN/mcl_mapgen_core/init.lua | 16 ++--- mods/MAPGEN/mcl_strongholds/init.lua | 4 +- mods/MAPGEN/mcl_structures/init.lua | 61 ++++++++++--------- mods/MAPGEN/mcl_villages/const.lua | 2 +- mods/MAPGEN/tsm_railcorridors/gameconfig.lua | 2 +- mods/MAPGEN/tsm_railcorridors/init.lua | 6 +- mods/PLAYER/mcl_playerinfo/init.lua | 4 +- mods/PLAYER/mcl_playerplus/init.lua | 5 +- mods/PLAYER/mcl_skins/init.lua | 11 ++-- mods/PLAYER/mcl_sprint/init.lua | 2 +- 27 files changed, 118 insertions(+), 117 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 21facbd1b..5758d194f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,5 @@ # Contributing to MineClone 2 -So you want to MineClone 2? +So you want to contribute to MineClone 2? Wow, thank you! :-) But first, some things to note: diff --git a/mods/CORE/_mcl_autogroup/init.lua b/mods/CORE/_mcl_autogroup/init.lua index e6b3aa2d0..76c68122b 100644 --- a/mods/CORE/_mcl_autogroup/init.lua +++ b/mods/CORE/_mcl_autogroup/init.lua @@ -298,7 +298,7 @@ function mcl_autogroup.get_wear(toolname, diggroup) return math.ceil(65535 / uses) end -local overwrite = function() +local function overwrite() for nname, ndef in pairs(minetest.registered_nodes) do local newgroups = table.copy(ndef.groups) if (nname ~= "ignore" and ndef.diggable) then diff --git a/mods/CORE/mcl_attached/init.lua b/mods/CORE/mcl_attached/init.lua index 146cb2251..4f538e104 100644 --- a/mods/CORE/mcl_attached/init.lua +++ b/mods/CORE/mcl_attached/init.lua @@ -1,17 +1,21 @@ +local vector = vector + +local facedir_to_dir = minetest.facedir_to_dir +local get_item_group = minetest.get_item_group +local remove_node = minetest.remove_node +local get_node = minetest.get_node + local original_function = minetest.check_single_for_falling -minetest.check_single_for_falling = function(pos) +function minetest.check_single_for_falling(pos) local ret_o = original_function(pos) - local ret = false local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "attached_node_facedir") ~= 0 then - local dir = minetest.facedir_to_dir(node.param2) + if get_item_group(node.name, "attached_node_facedir") ~= 0 then + local dir = facedir_to_dir(node.param2) if dir then - local cpos = vector.add(pos, dir) - local cnode = minetest.get_node(cpos) - if minetest.get_item_group(cnode.name, "solid") == 0 then - minetest.remove_node(pos) + if get_item_group(get_node(vector.add(pos, dir)).name, "solid") == 0 then + remove_node(pos) local drops = minetest.get_node_drops(node.name, "") for dr=1, #drops do minetest.add_item(pos, drops[dr]) @@ -20,7 +24,6 @@ minetest.check_single_for_falling = function(pos) end end end - return ret_o or ret end diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 0168229f2..1ac2c1f9b 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -150,7 +150,7 @@ function mcl_util.get_eligible_transfer_item_slot(src_inventory, src_list, dst_i end -- Returns true if itemstack is a shulker box -local is_not_shulker_box = function(itemstack) +local function is_not_shulker_box(itemstack) local g = minetest.get_item_group(itemstack:get_name(), "shulker_box") return g == 0 or g == nil end @@ -212,7 +212,7 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, end -- Normalize double container by forcing to always use the left segment first - local normalize_double_container = function(pos, node, ctype) + local function normalize_double_container(pos, node, ctype) if ctype == 6 then pos = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") if not pos then diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 0c26c38c8..a73f586e9 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -1,5 +1,5 @@ --these are lua locals, used for higher performance -local minetest,math,vector,ipairs = minetest,math,vector,ipairs +local minetest, math, vector, ipairs = minetest, math, vector, ipairs --this is used for the player pool in the sound buffer local pool = {} @@ -38,7 +38,7 @@ item_drop_settings.drop_single_item = false --if true, the drop control dro item_drop_settings.magnet_time = 0.75 -- how many seconds an item follows the player before giving up -local get_gravity = function() +local function get_gravity() return tonumber(minetest.settings:get("movement_gravity")) or 9.81 end @@ -60,7 +60,7 @@ mcl_item_entity.register_pickup_achievement("mcl_mobitems:blaze_rod", "mcl:blaze mcl_item_entity.register_pickup_achievement("mcl_mobitems:leather", "mcl:killCow") mcl_item_entity.register_pickup_achievement("mcl_core:diamond", "mcl:diamonds") -local check_pickup_achievements = function(object, player) +local function check_pickup_achievements(object, player) if has_awards then local itemname = ItemStack(object:get_luaentity().itemstring):get_name() local playername = player:get_player_name() @@ -72,7 +72,7 @@ local check_pickup_achievements = function(object, player) end end -local enable_physics = function(object, luaentity, ignore_check) +local function enable_physics(object, luaentity, ignore_check) if luaentity.physical_state == false or ignore_check == true then luaentity.physical_state = true object:set_properties({ @@ -83,7 +83,7 @@ local enable_physics = function(object, luaentity, ignore_check) end end -local disable_physics = function(object, luaentity, ignore_check, reset_movement) +local function disable_physics(object, luaentity, ignore_check, reset_movement) if luaentity.physical_state == true or ignore_check == true then luaentity.physical_state = false object:set_properties({ @@ -98,13 +98,11 @@ end minetest.register_globalstep(function(dtime) - tick = not tick for _,player in pairs(minetest.get_connected_players()) do if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then - local name = player:get_player_name() local pos = player:get_pos() diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index e741fb0bc..6fd98f550 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -496,7 +496,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o end -- Place a minecart at pointed_thing -mcl_minecarts.place_minecart = function(itemstack, pointed_thing, placer) +function mcl_minecarts.place_minecart(itemstack, pointed_thing, placer) if not pointed_thing.type == "node" then return end @@ -540,7 +540,7 @@ mcl_minecarts.place_minecart = function(itemstack, pointed_thing, placer) end -local register_craftitem = function(itemstring, entity_id, description, tt_help, longdesc, usagehelp, icon, creative) +local function register_craftitem(itemstring, entity_id, description, tt_help, longdesc, usagehelp, icon, creative) entity_mapping[itemstring] = entity_id local groups = { minecart = 1, transport = 1 } diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua index 4c26aea8c..53ec86d94 100644 --- a/mods/ENTITIES/mcl_minecarts/rails.lua +++ b/mods/ENTITIES/mcl_minecarts/rails.lua @@ -1,7 +1,7 @@ local S = minetest.get_translator("mcl_minecarts") -- Template rail function -local register_rail = function(itemstring, tiles, def_extras, creative) +local function register_rail(itemstring, tiles, def_extras, creative) local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=minetest.raillike_group("rail"),dig_by_water=1,destroy_by_lava_flow=1, transport=1} if creative == false then groups.not_in_creative_inventory = 1 diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index ef2687455..894a1f5e4 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -13,9 +13,8 @@ local minetest_get_node_light = minetest.get_node_light local DOUBLE_PI = math.pi * 2 local THIRTY_SECONDTH_PI = DOUBLE_PI * 0.03125 - --a simple helper function which is too small to move into movement.lua -local quick_rotate = function(self,dtime) +local function quick_rotate(self,dtime) self.yaw = self.yaw + THIRTY_SECONDTH_PI if self.yaw > DOUBLE_PI then self.yaw = self.yaw - DOUBLE_PI @@ -39,7 +38,7 @@ end ]]-- --this is basically reverse jump_check -local cliff_check = function(self,dtime) +local function cliff_check(self,dtime) --mobs will flip out if they are falling without this if self.object:get_velocity().y ~= 0 then return false @@ -115,7 +114,7 @@ local function land_state_switch(self, dtime) end -- states are executed here -local land_state_execution = function(self,dtime) +local function land_state_execution(self, dtime) --[[ -- this is a debug which shows the timer and makes mobs breed 100 times faster print(self.breed_timer) @@ -391,7 +390,7 @@ end -- state switching logic (stand, walk, run, attacks) local swim_state_list_wandering = {"stand", "swim"} -local swim_state_switch = function(self, dtime) +local function swim_state_switch(self, dtime) self.state_timer = self.state_timer - dtime if self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() @@ -401,7 +400,7 @@ end --check if a mob needs to turn while swimming -local swim_turn_check = function(self,dtime) +local function swim_turn_check(self,dtime) local pos = self.object:get_pos() pos.y = pos.y + 0.1 @@ -420,8 +419,7 @@ local swim_turn_check = function(self,dtime) end --this is to swap the built in engine acceleration modifier -local swim_physics_swapper = function(self,inside_swim_node) - +local function swim_physics_swapper(self, inside_swim_node) --should be swimming, gravity is applied, switch to floating if inside_swim_node and self.object:get_acceleration().y ~= 0 then self.object:set_acceleration(vector.new(0,0,0)) @@ -435,7 +433,7 @@ end local random_pitch_multiplier = {-1,1} -- states are executed here -local swim_state_execution = function(self,dtime) +local function swim_state_execution(self, dtime) local pos = self.object:get_pos() @@ -452,7 +450,7 @@ local swim_state_execution = function(self,dtime) end --turn gravity on or off - swim_physics_swapper(self,inside_swim_node) + swim_physics_swapper(self, inside_swim_node) --swim properly if inside swim node if inside_swim_node then @@ -530,7 +528,7 @@ ______ _ -- state switching logic (stand, walk, run, attacks) local fly_state_list_wandering = {"stand", "fly"} -local fly_state_switch = function(self, dtime) +local function fly_state_switch(self, dtime) if self.hostile and self.attacking then self.state = "attack" @@ -546,7 +544,7 @@ end --check if a mob needs to turn while flying -local fly_turn_check = function(self,dtime) +local function fly_turn_check(self, dtime) local pos = self.object:get_pos() pos.y = pos.y + 0.1 @@ -565,7 +563,7 @@ local fly_turn_check = function(self,dtime) end --this is to swap the built in engine acceleration modifier -local fly_physics_swapper = function(self,inside_fly_node) +local function fly_physics_swapper(self, inside_fly_node) --should be flyming, gravity is applied, switch to floating if inside_fly_node and self.object:get_acceleration().y ~= 0 then @@ -580,7 +578,7 @@ end local random_pitch_multiplier = {-1,1} -- states are executed here -local fly_state_execution = function(self,dtime) +local function fly_state_execution(self, dtime) local pos = self.object:get_pos() pos.y = pos.y + 0.1 local current_node = minetest_get_node(pos).name @@ -794,7 +792,7 @@ ___ ___ _ _ _ ]]-- --the main loop -mobs.mob_step = function(self, dtime) +function mobs.mob_step(self, dtime) --do not continue if non-existent if not self or not self.object or not self.object:get_luaentity() then diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index bf7176b99..70167b421 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -167,7 +167,7 @@ Overworld regular: -- count how many mobs are in an area -local count_mobs = function(pos) +local function count_mobs(pos) local num = 0 for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do if object and object:get_luaentity() and object:get_luaentity()._cmi_is_mob then @@ -242,8 +242,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh end --[[ - local spawn_action - spawn_action = function(pos, node, active_object_count, active_object_count_wider, name) + local function spawn_action(pos, node, active_object_count, active_object_count_wider, name) local orig_pos = table.copy(pos) -- is mob actually registered? @@ -486,7 +485,8 @@ local axis local inner = 15 local outer = 64 local int = {-1,1} -local position_calculation = function(pos) + +local function position_calculation(pos) pos = vector_floor(pos) diff --git a/mods/ITEMS/REDSTONE/mesecons/presets.lua b/mods/ITEMS/REDSTONE/mesecons/presets.lua index f624c52fe..d9d8418d8 100644 --- a/mods/ITEMS/REDSTONE/mesecons/presets.lua +++ b/mods/ITEMS/REDSTONE/mesecons/presets.lua @@ -96,12 +96,12 @@ local function rules_from_dir(ruleset, dir) if dir.z == -1 then return ruleset.zn end end -mesecon.rules.buttonlike_get = function(node) +function mesecon.rules.buttonlike_get(node) local dir = minetest.facedir_to_dir(node.param2) return rules_from_dir(rules_buttonlike, dir) end -mesecon.rules.wallmounted_get = function(node) +function mesecon.rules.wallmounted_get(node) local dir = minetest.wallmounted_to_dir(node.param2) return rules_from_dir(rules_wallmounted, dir) end diff --git a/mods/ITEMS/REDSTONE/mesecons/services.lua b/mods/ITEMS/REDSTONE/mesecons/services.lua index 1e3e6237b..7d1fce2d8 100644 --- a/mods/ITEMS/REDSTONE/mesecons/services.lua +++ b/mods/ITEMS/REDSTONE/mesecons/services.lua @@ -1,6 +1,6 @@ -- Dig and place services -mesecon.on_placenode = function(pos, node) +function mesecon.on_placenode(pos, node) mesecon.execute_autoconnect_hooks_now(pos, node) -- Receptors: Send on signal when active @@ -70,7 +70,7 @@ mesecon.on_placenode = function(pos, node) end end -mesecon.on_dignode = function(pos, node) +function mesecon.on_dignode(pos, node) if mesecon.is_conductor_on(node) then mesecon.receptor_off(pos, mesecon.conductor_get_rules(node)) elseif mesecon.is_receptor_on(node.name) then @@ -95,7 +95,7 @@ mesecon.on_dignode = function(pos, node) mesecon.execute_autoconnect_hooks_queue(pos, node) end -mesecon.on_blastnode = function(pos, node) +function mesecon.on_blastnode(pos, node) local node = minetest.get_node(pos) minetest.remove_node(pos) mesecon.on_dignode(pos, node) diff --git a/mods/ITEMS/REDSTONE/mesecons_button/init.lua b/mods/ITEMS/REDSTONE/mesecons_button/init.lua index 377a24c00..a8c671004 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_button/init.lua @@ -21,7 +21,7 @@ local boxes_on = { } -- Push the button -mesecon.push_button = function(pos, node) +function mesecon.push_button(pos, node) -- No-op if button is already pushed if mesecon.is_receptor_on(node) then return diff --git a/mods/ITEMS/mcl_fences/init.lua b/mods/ITEMS/mcl_fences/init.lua index e60782215..ddd85d470 100644 --- a/mods/ITEMS/mcl_fences/init.lua +++ b/mods/ITEMS/mcl_fences/init.lua @@ -20,7 +20,7 @@ local cz2 = {-2/16, -0.5, 2/16, 2/16, 1.01, 0.5} --unten(quer) z mcl_fences = {} -mcl_fences.register_fence = function(id, fence_name, texture, groups, hardness, blast_resistance, connects_to, sounds) +function mcl_fences.register_fence(id, fence_name, texture, groups, hardness, blast_resistance, connects_to, sounds) local cgroups = table.copy(groups) if cgroups == nil then cgroups = {} end cgroups.fence = 1 @@ -72,7 +72,7 @@ mcl_fences.register_fence = function(id, fence_name, texture, groups, hardness, return fence_id end -mcl_fences.register_fence_gate = function(id, fence_gate_name, texture, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close) +function mcl_fences.register_fence_gate(id, fence_gate_name, texture, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close) local meta2 local state2 = 0 diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 176fb250c..f1a95fec6 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -522,7 +522,7 @@ end -- * pointed_thing: Pointed thing to ignite -- * player: Player who sets fire or nil if nobody -- * allow_on_fire: If false, can't ignite fire on fire (default: true) -mcl_fire.set_fire = function(pointed_thing, player, allow_on_fire) +function mcl_fire.set_fire(pointed_thing, player, allow_on_fire) local pname if player == nil then pname = "" diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index cc7c5cca5..567e96e96 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -305,7 +305,7 @@ local flying_bobber_ENTITY={ } -- Movement function of flying bobber -local flying_bobber_on_step = function(self, dtime) +local function flying_bobber_on_step(self, dtime) self.timer=self.timer+dtime local pos = self.object:get_pos() local node = minetest.get_node(pos) @@ -315,12 +315,9 @@ local flying_bobber_on_step = function(self, dtime) -- Destroy when hitting a solid node if self._lastpos.x~=nil then if (def and (def.walkable or def.liquidtype == "flowing" or def.liquidtype == "source")) or not def then - local make_child= function(object) - local ent = object:get_luaentity() - ent.player = self._thrower - ent.child = true - end - make_child(minetest.add_entity(self._lastpos, "mcl_fishing:bobber_entity")) + local ent = minetest.add_entity(self._lastpos, "mcl_fishing:bobber_entity"):get_luaentity() + ent.player = self._thrower + ent.child = true self.object:remove() return end diff --git a/mods/ITEMS/xpanes/init.lua b/mods/ITEMS/xpanes/init.lua index b7faffb3b..472b3efdf 100644 --- a/mods/ITEMS/xpanes/init.lua +++ b/mods/ITEMS/xpanes/init.lua @@ -170,7 +170,7 @@ end local canonical_color = "yellow" -- Register glass pane (stained and unstained) -local pane = function(description, node, append) +local function pane(description, node, append) local texture1, longdesc, entry_name, create_entry local is_canonical = true -- Special case: Default (unstained) glass texture diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 4e01df5f2..9108b75c1 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1775,7 +1775,7 @@ local function register_biomelike_ores() -- Mesa strata (registered as sheet ores) -- Helper function to create strata. - local stratum = function(y_min, height, color, seed, is_perfect) + local function stratum(y_min, height, color, seed, is_perfect) if not height then height = 1 end @@ -3079,7 +3079,7 @@ local function register_decorations() }) -- Doubletall grass - local register_doubletall_grass = function(offset, scale, biomes) + local function register_doubletall_grass(offset, scale, biomes) for b=1, #biomes do local param2 = minetest.registered_biomes[biomes[b]]._mcl_palette_index @@ -3115,7 +3115,7 @@ local function register_decorations() register_doubletall_grass(-0.0005, -0.03, {"Savanna", "SavannaM"}) -- Large ferns - local register_double_fern = function(offset, scale, biomes) + local function register_double_fern(offset, scale, biomes) for b=1, #biomes do local param2 = minetest.registered_biomes[biomes[b]]._mcl_palette_index minetest.register_decoration({ @@ -3149,7 +3149,7 @@ local function register_decorations() register_double_fern(0.15, 0.1, { "JungleM" }) -- Large flowers - local register_large_flower = function(name, biomes, seed, offset, flower_forest_offset) + local function register_large_flower(name, biomes, seed, offset, flower_forest_offset) local maxi if flower_forest_offset then maxi = 2 diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 285da25c2..b3db122e6 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -765,7 +765,7 @@ local function register_mgv6_decorations() }) -- Large flowers - local register_large_flower = function(name, seed, offset) + local function register_large_flower(name, seed, offset) minetest.register_decoration({ deco_type = "schematic", schematic = { @@ -1169,7 +1169,7 @@ end -- minp and maxp (from an on_generated callback) and returns the real world coordinates -- as X, Z. -- Inverse function of xz_to_biomemap ---[[local biomemap_to_xz = function(index, minp, maxp) +--[[local function biomemap_to_xz(index, minp, maxp) local xwidth = maxp.x - minp.x + 1 local zwidth = maxp.z - minp.z + 1 local x = ((index-1) % xwidth) + minp.x @@ -1180,7 +1180,7 @@ end]] -- Takes x and z coordinates and minp and maxp of a generated chunk -- (in on_generated callback) and returns a biomemap index) -- Inverse function of biomemap_to_xz -local xz_to_biomemap_index = function(x, z, minp, maxp) +local function xz_to_biomemap_index(x, z, minp, maxp) local xwidth = maxp.x - minp.x + 1 local zwidth = maxp.z - minp.z + 1 local minix = x % xwidth @@ -1404,7 +1404,7 @@ local function generate_structures(minp, maxp, blockseed, biomemap) -- TODO: Spawn witch in or around hut when the mob sucks less. - local place_tree_if_free = function(pos, prev_result) + local function place_tree_if_free(pos, prev_result) local nn = minetest.get_node(pos).name if nn == "mcl_flowers:waterlily" or nn == "mcl_core:water_source" or nn == "mcl_core:water_flowing" or nn == "air" then minetest.set_node(pos, {name="mcl_core:tree", param2=0}) @@ -1720,7 +1720,7 @@ end -- Generate mushrooms in caves manually. -- Minetest's API does not support decorations in caves yet. :-( -local generate_underground_mushrooms = function(minp, maxp, seed) +local function generate_underground_mushrooms(minp, maxp, seed) local pr_shroom = PseudoRandom(seed-24359) -- Generate rare underground mushrooms -- TODO: Make them appear in groups, use Perlin noise @@ -1754,7 +1754,7 @@ else end -- Generate Nether decorations manually: Eternal fire, mushrooms, nether wart -- Minetest's API does not support decorations in caves yet. :-( -local generate_nether_decorations = function(minp, maxp, seed) +local function generate_nether_decorations(minp, maxp, seed) local pr_nether = PseudoRandom(seed+667) if minp.y > mcl_vars.mg_nether_max or maxp.y < mcl_vars.mg_nether_min then @@ -1771,7 +1771,7 @@ local generate_nether_decorations = function(minp, maxp, seed) local ssand = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:soul_sand"}) -- Helper function to spawn “fake” decoration - local special_deco = function(nodes, spawn_func) + local function special_deco(nodes, spawn_func) for n = 1, #nodes do bpos = {x = nodes[n].x, y = nodes[n].y + 1, z = nodes[n].z } @@ -1912,7 +1912,7 @@ end local bedrock_check if mcl_vars.mg_bedrock_is_rough then - bedrock_check = function(pos, _, pr) + function bedrock_check(pos, _, pr) local y = pos.y -- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer -- This code assumes a bedrock height of 5 layers. diff --git a/mods/MAPGEN/mcl_strongholds/init.lua b/mods/MAPGEN/mcl_strongholds/init.lua index e465b2e40..083172a3c 100644 --- a/mods/MAPGEN/mcl_strongholds/init.lua +++ b/mods/MAPGEN/mcl_strongholds/init.lua @@ -25,7 +25,7 @@ local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superfl -- The stronghold positions are based on the world seed. -- The actual position might be offset by a few blocks because it might be shifted -- to make sure the end portal room is completely within the boundaries of a mapchunk. -local init_strongholds = function() +local function init_strongholds() if strongholds_inited then return end @@ -67,7 +67,7 @@ local init_strongholds = function() end -- Stronghold generation for register_on_generated. -local generate_strongholds = function(minp, maxp, blockseed) +local function generate_strongholds(minp, maxp, blockseed) local pr = PseudoRandom(blockseed) for s=1, #strongholds do if not strongholds[s].generated then diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index f939b9c1a..dfb7da24b 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -1,5 +1,9 @@ -local S = minetest.get_translator("mcl_structures") -mcl_structures ={} +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) +local modpath = minetest.get_modpath(modname) + +mcl_structures = {} + local rotations = { "0", "90", @@ -14,7 +18,8 @@ local function ecb_place(blockpos, action, calls_remaining, param) param.after_placement_callback(param.p1, param.p2, param.size, param.rotation, param.pr, param.callback_param) end end -mcl_structures.place_schematic = function(pos, schematic, rotation, replacements, force_placement, flags, after_placement_callback, pr, callback_param) + +function mcl_structures.place_schematic(pos, schematic, rotation, replacements, force_placement, flags, after_placement_callback, pr, callback_param) local s = loadstring(minetest.serialize_schematic(schematic, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic")() if s and s.size then local x, z = s.size.x, s.size.z @@ -37,7 +42,7 @@ mcl_structures.place_schematic = function(pos, schematic, rotation, replacements end end -mcl_structures.get_struct = function(file) +function mcl_structures.get_struct(file) local localfile = minetest.get_modpath("mcl_structures").."/schematics/"..file local file, errorload = io.open(localfile, "rb") if errorload ~= nil then @@ -53,7 +58,7 @@ end -- Call on_construct on pos. -- Useful to init chests from formspec. -local init_node_construct = function(pos) +local function init_node_construct(pos) local node = minetest.get_node(pos) local def = minetest.registered_nodes[node.name] if def and def.on_construct then @@ -64,7 +69,7 @@ local init_node_construct = function(pos) end -- The call of Struct -mcl_structures.call_struct = function(pos, struct_style, rotation, pr) +function mcl_structures.call_struct(pos, struct_style, rotation, pr) minetest.log("action","[mcl_structures] call_struct " .. struct_style.." at "..minetest.pos_to_string(pos)) if not rotation then rotation = "random" @@ -96,13 +101,13 @@ mcl_structures.call_struct = function(pos, struct_style, rotation, pr) end end -mcl_structures.generate_desert_well = function(pos, rot) +function mcl_structures.generate_desert_well(pos, rot) local newpos = {x=pos.x,y=pos.y-2,z=pos.z} - local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_desert_well.mts" + local path = modpath.."/schematics/mcl_structures_desert_well.mts" return mcl_structures.place_schematic(newpos, path, rot or "0", nil, true) end -mcl_structures.generate_igloo = function(pos, rotation, pr) +function mcl_structures.generate_igloo(pos, rotation, pr) -- Place igloo local success, rotation = mcl_structures.generate_igloo_top(pos, pr) -- Place igloo basement with 50% chance @@ -148,7 +153,7 @@ mcl_structures.generate_igloo = function(pos, rotation, pr) else return success end - local set_brick = function(pos) + local function set_brick(pos) local c = pr:next(1, 3) -- cracked chance local m = pr:next(1, 10) -- chance for monster egg local brick @@ -198,11 +203,11 @@ mcl_structures.generate_igloo = function(pos, rotation, pr) return success end -mcl_structures.generate_igloo_top = function(pos, pr) +function mcl_structures.generate_igloo_top(pos, pr) -- FIXME: This spawns bookshelf instead of furnace. Fix this! -- Furnace does ot work atm because apparently meta is not set. :-( local newpos = {x=pos.x,y=pos.y-1,z=pos.z} - local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_igloo_top.mts" + local path = modpath.."/schematics/mcl_structures_igloo_top.mts" local rotation = tostring(pr:next(0,3)*90) return mcl_structures.place_schematic(newpos, path, rotation, nil, true), rotation end @@ -250,22 +255,22 @@ local function igloo_placement_callback(p1, p2, size, orientation, pr) mcl_loot.fill_inventory(inv, "main", lootitems, pr) end -mcl_structures.generate_igloo_basement = function(pos, orientation, pr) +function mcl_structures.generate_igloo_basement(pos, orientation, pr) -- TODO: Add brewing stand -- TODO: Add monster eggs -- TODO: Spawn villager and zombie villager - local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_igloo_basement.mts" + local path = modpath.."/schematics/mcl_structures_igloo_basement.mts" mcl_structures.place_schematic(pos, path, orientation, nil, true, nil, igloo_placement_callback, pr) end -mcl_structures.generate_boulder = function(pos, rotation, pr) +function mcl_structures.generate_boulder(pos, rotation, pr) -- Choose between 2 boulder sizes (2×2×2 or 3×3×3) local r = pr:next(1, 10) local path if r <= 3 then - path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_boulder_small.mts" + path = modpath.."/schematics/mcl_structures_boulder_small.mts" else - path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_boulder.mts" + path = modpath.."/schematics/mcl_structures_boulder.mts" end local newpos = {x=pos.x,y=pos.y-1,z=pos.z} @@ -284,22 +289,22 @@ local function hut_placement_callback(p1, p2, size, orientation, pr) end end -mcl_structures.generate_witch_hut = function(pos, rotation, pr) +function mcl_structures.generate_witch_hut(pos, rotation, pr) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_witch_hut.mts" mcl_structures.place_schematic(pos, path, rotation, nil, true, nil, hut_placement_callback, pr) end -mcl_structures.generate_ice_spike_small = function(pos, rotation) +function mcl_structures.generate_ice_spike_small(pos, rotation) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_ice_spike_small.mts" return minetest.place_schematic(pos, path, rotation or "random", nil, false) -- don't serialize schematics for registered biome decorations, for MT 5.4.0 end -mcl_structures.generate_ice_spike_large = function(pos, rotation) +function mcl_structures.generate_ice_spike_large(pos, rotation) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_ice_spike_large.mts" return minetest.place_schematic(pos, path, rotation or "random", nil, false) -- don't serialize schematics for registered biome decorations, for MT 5.4.0 end -mcl_structures.generate_fossil = function(pos, rotation, pr) +function mcl_structures.generate_fossil(pos, rotation, pr) -- Generates one out of 8 possible fossil pieces local newpos = {x=pos.x,y=pos.y-1,z=pos.z} local fossils = { @@ -317,17 +322,17 @@ mcl_structures.generate_fossil = function(pos, rotation, pr) return mcl_structures.place_schematic(newpos, path, rotation or "random", nil, true) end -mcl_structures.generate_end_exit_portal = function(pos, rot) +function mcl_structures.generate_end_exit_portal(pos, rot) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_end_exit_portal.mts" return mcl_structures.place_schematic(pos, path, rot or "0", {["mcl_portals:portal_end"] = "air"}, true) end -mcl_structures.generate_end_exit_portal_open = function(pos, rot) +function mcl_structures.generate_end_exit_portal_open(pos, rot) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_end_exit_portal.mts" return mcl_structures.place_schematic(pos, path, rot or "0", nil, true) end -mcl_structures.generate_end_gateway_portal = function(pos, rot) +function mcl_structures.generate_end_gateway_portal(pos, rot) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_end_gateway_portal.mts" return mcl_structures.place_schematic(pos, path, rot or "0", nil, true) end @@ -410,7 +415,7 @@ local function shrine_placement_callback(p1, p2, size, rotation, pr) end end -mcl_structures.generate_end_portal_shrine = function(pos, rotation, pr) +function mcl_structures.generate_end_portal_shrine(pos, rotation, pr) local offset = {x=6, y=4, z=6} --local size = {x=13, y=8, z=13} local newpos = { x = pos.x - offset.x, y = pos.y, z = pos.z - offset.z } @@ -493,7 +498,7 @@ local function temple_placement_callback(p1, p2, size, rotation, pr) end end -mcl_structures.generate_desert_temple = function(pos, rotation, pr) +function mcl_structures.generate_desert_temple(pos, rotation, pr) -- No Generating for the temple ... Why using it ? No Change local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_desert_temple.mts" local newpos = {x=pos.x,y=pos.y-12,z=pos.z} @@ -517,7 +522,7 @@ Format of return value: TODO: Implement this function for all other structure types as well. ]] -mcl_structures.get_registered_structures = function(structure_type) +function mcl_structures.get_registered_structures(structure_type) if registered_structures[structure_type] then return table.copy(registered_structures[structure_type]) else @@ -527,7 +532,7 @@ end -- Register a structures table for the given type. The table format is the same as for -- mcl_structures.get_registered_structures. -mcl_structures.register_structures = function(structure_type, structures) +function mcl_structures.register_structures(structure_type, structures) registered_structures[structure_type] = structures end diff --git a/mods/MAPGEN/mcl_villages/const.lua b/mods/MAPGEN/mcl_villages/const.lua index e5cbc9b39..eb7806209 100644 --- a/mods/MAPGEN/mcl_villages/const.lua +++ b/mods/MAPGEN/mcl_villages/const.lua @@ -1,5 +1,5 @@ -- switch for debugging -settlements.debug = function(message) +function settlements.debug(message) -- minetest.chat_send_all(message) -- minetest.log("warning", "[mcl_villages] "..message) minetest.log("verbose", "[mcl_villages] "..message) diff --git a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua index 904c3af08..168ecf535 100644 --- a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua +++ b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua @@ -27,7 +27,7 @@ if mg_name == "v6" then } else -- This generates dark oak wood in mesa biomes and oak wood everywhere else. - tsm_railcorridors.nodes.corridor_woods_function = function(pos, node) + function tsm_railcorridors.nodes.corridor_woods_function(pos, node) if minetest.get_item_group(node.name, "hardened_clay") ~= 0 then return "mcl_core:darkwood", "mcl_fences:dark_oak_fence" else diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 550167dc3..d7a074a00 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -681,11 +681,11 @@ local function create_corridor_section(waypoint, axis, sign, up_or_down, up_or_d railsegcount = segcount end for i=1,railsegcount do - local p = {x=waypoint.x+vek.x*i, y=waypoint.y+vek.y*i-1, z=waypoint.z+vek.z*i} + local p = {x = waypoint.x + vek.x * i, y = waypoint.y + vek.y * i-1, z = waypoint.z + vek.z * i} -- Randomly returns either the left or right side of the main rail. -- Also returns offset as second return value. - local left_or_right = function(pos, vek) + local function left_or_right(pos, vek) local off if pr:next(1, 2) == 1 then -- left @@ -765,7 +765,7 @@ local function create_corridor_section(waypoint, axis, sign, up_or_down, up_or_d -- Place cobwebs left and right in the corridor if place_cobwebs and tsm_railcorridors.nodes.cobweb then -- Helper function to place a cobweb at the side (based on chance an Perlin noise) - local cobweb_at_side = function(basepos, vek) + local function cobweb_at_side(basepos, vek) if pr:next(1,5) == 1 then local h = pr:next(0, 2) -- 3 possible cobweb heights local cpos = {x=basepos.x+vek.x, y=basepos.y+h, z=basepos.z+vek.z} diff --git a/mods/PLAYER/mcl_playerinfo/init.lua b/mods/PLAYER/mcl_playerinfo/init.lua index 5086f3195..9c5d1433f 100644 --- a/mods/PLAYER/mcl_playerinfo/init.lua +++ b/mods/PLAYER/mcl_playerinfo/init.lua @@ -1,3 +1,5 @@ +local table = table + -- Player state for public API mcl_playerinfo = {} @@ -21,7 +23,7 @@ end local time = 0 -local get_player_nodes = function(player_pos) +local function get_player_nodes(player_pos) local work_pos = table.copy(player_pos) -- what is around me? diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 40752b835..ceaef6346 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -25,7 +25,7 @@ local mcl_playerplus_internal = {} local time = 0 local look_pitch = 0 -local player_collision = function(player) +local function player_collision(player) local pos = player:get_pos() --local vel = player:get_velocity() @@ -48,7 +48,6 @@ local player_collision = function(player) z = z + (vec.z * force) end end - return {x,z} end @@ -57,7 +56,7 @@ local function degrees(rad) return rad * 180.0 / math.pi end -local dir_to_pitch = function(dir) +local function dir_to_pitch(dir) --local dir2 = vector.normalize(dir) local xz = math.abs(dir.x) + math.abs(dir.z) return -math.atan2(-dir.y, xz) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 0f23519ab..fb91d74d3 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -70,7 +70,7 @@ while true do id = id + 1 end -mcl_skins.cycle_skin = function(player) +function mcl_skins.cycle_skin(player) local skin_id = tonumber(player:get_meta():get_string("mcl_skins:skin_id")) if not skin_id then skin_id = 0 @@ -82,7 +82,7 @@ mcl_skins.cycle_skin = function(player) mcl_skins.set_player_skin(player, skin_id) end -mcl_skins.set_player_skin = function(player, skin_id) +function mcl_skins.set_player_skin(player, skin_id) if not player then return false end @@ -124,7 +124,7 @@ mcl_skins.set_player_skin = function(player, skin_id) return true end -mcl_skins.update_player_skin = function(player) +function mcl_skins.update_player_skin(player) if not player then return end @@ -134,7 +134,6 @@ end -- load player skin on join minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() local skin_id = player:get_meta():get_string("mcl_skins:skin_id") local set_skin @@ -156,7 +155,7 @@ end) mcl_skins.registered_on_set_skins = {} -mcl_skins.register_on_set_skin = function(func) +function mcl_skins.register_on_set_skin(func) table.insert(mcl_skins.registered_on_set_skins, func) end @@ -231,7 +230,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) -mcl_skins.show_formspec = function(playername) +function mcl_skins.show_formspec(playername) local formspec = "size[7,8.5]" formspec = formspec .. "label[2,2;" .. minetest.formspec_escape(minetest.colorize("#383838", S("Select player skin:"))) .. "]" diff --git a/mods/PLAYER/mcl_sprint/init.lua b/mods/PLAYER/mcl_sprint/init.lua index 12d0394e5..546a5f4f0 100644 --- a/mods/PLAYER/mcl_sprint/init.lua +++ b/mods/PLAYER/mcl_sprint/init.lua @@ -16,7 +16,7 @@ local players = {} -- Returns true if the player with the given name is sprinting, false if not. -- Returns nil if player does not exist. -mcl_sprint.is_sprinting = function(playername) +function mcl_sprint.is_sprinting(playername) if players[playername] then return players[playername].sprinting else From 49044ac15e8bcc01044a4caf9ffa2c405723d02f Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 13:18:12 +0200 Subject: [PATCH 24/38] unify codestyle [2] --- CONTRIBUTING.md | 22 ++++++++++++++++++++++ mods/ENVIRONMENT/mcl_moon/init.lua | 4 ++-- mods/ENVIRONMENT/mcl_weather/rain.lua | 24 +++++++++++------------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5758d194f..023d89de8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,6 +46,28 @@ Your commit names should be relatively descriptive, e.g. when saying "Fix #issue Contributors will be credited in `CREDITS.md`. +## Code Style + +Each mod must provide `mod.conf`. +Each mod which add API functions should store functions inside a global table named like the mod. +Object oriented API shoud be avoided e.g.:`function mobs.register_mod(self)` +Functions should be defined in this way: +``` +function mcl_xyz.stuff(param) end +``` +Insteed of this way: +``` +mcl_xyz.stuff = function(param) end +``` +Indentation must be unified, more likely with tabs. + +Time sensitive mods should make a local copy of most used API functions to improve performances. +``` +local vector = vector +local get_node = minetest.get_node +``` + + ## Features > 1.12 If you want to make a feature that was added in a Minecraft version later than 1.12, you should fork MineClone5 (mineclone5 branch in the repository) and add your changes to this. diff --git a/mods/ENVIRONMENT/mcl_moon/init.lua b/mods/ENVIRONMENT/mcl_moon/init.lua index 1a5030b4e..200c6ca41 100644 --- a/mods/ENVIRONMENT/mcl_moon/init.lua +++ b/mods/ENVIRONMENT/mcl_moon/init.lua @@ -13,7 +13,7 @@ minetest.log("info", "[mcl_moon] Moon phase offset of this world: "..phase_offse mcl_moon = {} mcl_moon.MOON_PHASES = MOON_PHASES -mcl_moon.get_moon_phase = function() +function mcl_moon.get_moon_phase() local after_midday = 0 -- Moon phase changes after midday local tod = minetest.get_timeofday() @@ -23,7 +23,7 @@ mcl_moon.get_moon_phase = function() return (minetest.get_day_count() + phase_offset + after_midday) % MOON_PHASES end -local get_moon_texture = function() +local function get_moon_texture() local phase = mcl_moon.get_moon_phase() local x = phase % MOON_PHASES_HALF local y diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index 786e08fa9..c128da942 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -20,7 +20,7 @@ mcl_weather.rain = { init_done = false, } -mcl_weather.rain.sound_handler = function(player) +function mcl_weather.rain.sound_handler(player) return minetest.sound_play("weather_rain", { to_player = player:get_player_name(), loop = true, @@ -28,7 +28,7 @@ mcl_weather.rain.sound_handler = function(player) end -- set skybox based on time (uses skycolor api) -mcl_weather.rain.set_sky_box = function() +function mcl_weather.rain.set_sky_box() if mcl_weather.state == "rain" then mcl_weather.skycolor.add_layer( "weather-pack-rain-sky", @@ -46,8 +46,7 @@ end -- creating manually parctiles instead of particles spawner because of easier to control -- spawn position. -mcl_weather.rain.add_rain_particles = function(player) - +function mcl_weather.rain.add_rain_particles(player) mcl_weather.rain.last_rp_count = 0 for i=mcl_weather.rain.particles_count, 1,-1 do local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) @@ -70,7 +69,7 @@ mcl_weather.rain.add_rain_particles = function(player) end -- Simple random texture getter -mcl_weather.rain.get_texture = function() +function mcl_weather.rain.get_texture() local texture_name local random_number = math.random() if random_number > 0.33 then @@ -85,7 +84,7 @@ end -- register player for rain weather. -- basically needs for origin sky reference and rain sound controls. -mcl_weather.rain.add_player = function(player) +function mcl_weather.rain.add_player(player) if mcl_weather.players[player:get_player_name()] == nil then local player_meta = {} player_meta.origin_sky = {player:get_sky()} @@ -95,7 +94,7 @@ end -- remove player from player list effected by rain. -- be sure to remove sound before removing player otherwise soundhandler reference will be lost. -mcl_weather.rain.remove_player = function(player) +function mcl_weather.rain.remove_player(player) local player_meta = mcl_weather.players[player:get_player_name()] if player_meta ~= nil and player_meta.origin_sky ~= nil then player:set_clouds({color="#FFF0F0E5"}) @@ -119,7 +118,7 @@ end) -- adds and removes rain sound depending how much rain particles around player currently exist. -- have few seconds delay before each check to avoid on/off sound too often -- when player stay on 'edge' where sound should play and stop depending from random raindrop appearance. -mcl_weather.rain.update_sound = function(player) +function mcl_weather.rain.update_sound(player) local player_meta = mcl_weather.players[player:get_player_name()] if player_meta ~= nil then if player_meta.sound_updated ~= nil and player_meta.sound_updated + 5 > minetest.get_gametime() then @@ -140,7 +139,7 @@ mcl_weather.rain.update_sound = function(player) end -- rain sound removed from player. -mcl_weather.rain.remove_sound = function(player) +function mcl_weather.rain.remove_sound(player) local player_meta = mcl_weather.players[player:get_player_name()] if player_meta ~= nil and player_meta.sound_handler ~= nil then minetest.sound_fade(player_meta.sound_handler, -0.5, 0.0) @@ -150,7 +149,7 @@ mcl_weather.rain.remove_sound = function(player) end -- callback function for removing rain -mcl_weather.rain.clear = function() +function mcl_weather.rain.clear() mcl_weather.rain.raining = false mcl_weather.rain.sky_last_update = -1 mcl_weather.rain.init_done = false @@ -166,11 +165,10 @@ minetest.register_globalstep(function(dtime) if mcl_weather.state ~= "rain" then return false end - mcl_weather.rain.make_weather() end) -mcl_weather.rain.make_weather = function() +function mcl_weather.rain.make_weather() if mcl_weather.rain.init_done == false then mcl_weather.rain.raining = true mcl_weather.rain.set_sky_box() @@ -190,7 +188,7 @@ mcl_weather.rain.make_weather = function() end -- Switch the number of raindrops: "thunder" for many raindrops, otherwise for normal raindrops -mcl_weather.rain.set_particles_mode = function(mode) +function mcl_weather.rain.set_particles_mode(mode) if mode == "thunder" then mcl_weather.rain.particles_count = PARTICLES_COUNT_THUNDER else From 6105a9ef2292efe1a8a6da1a695d2e5d9baab322 Mon Sep 17 00:00:00 2001 From: NO11 Date: Tue, 25 May 2021 20:00:06 +0000 Subject: [PATCH 25/38] Fix function code style in mcl:core/crafting.lua --- mods/ITEMS/mcl_core/crafting.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/crafting.lua b/mods/ITEMS/mcl_core/crafting.lua index f031c7ca2..cec26e747 100644 --- a/mods/ITEMS/mcl_core/crafting.lua +++ b/mods/ITEMS/mcl_core/crafting.lua @@ -4,7 +4,7 @@ -- Crafting definition -- -local craft_planks = function(output, input) +local function craft_planks(output, input) minetest.register_craft({ output = "mcl_core:"..output.."wood 4", recipe = { From 4c9eeed499d225552bd7e35a4433dc1c892383bc Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 26 May 2021 16:25:16 +0200 Subject: [PATCH 26/38] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 023d89de8..1b5098a4f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,7 +50,7 @@ Contributors will be credited in `CREDITS.md`. Each mod must provide `mod.conf`. Each mod which add API functions should store functions inside a global table named like the mod. -Object oriented API shoud be avoided e.g.:`function mobs.register_mod(self)` +Public functions should not use self references but rather just access the table directly. Functions should be defined in this way: ``` function mcl_xyz.stuff(param) end From fd387a65af861e7e8fbd099f067cb9152c69b349 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 26 May 2021 16:42:12 +0200 Subject: [PATCH 27/38] fix some codestyle issues in hudbars --- mods/HUD/hudbars/init.lua | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/mods/HUD/hudbars/init.lua b/mods/HUD/hudbars/init.lua index 6f90aa03d..a88d14dcf 100644 --- a/mods/HUD/hudbars/init.lua +++ b/mods/HUD/hudbars/init.lua @@ -1,17 +1,22 @@ -local S = minetest.get_translator("hudbars") +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local S = minetest.get_translator(modname) local N = function(s) return s end -hb = {} +local math = math +local table = table -hb.hudtables = {} - --- number of registered HUD bars -hb.hudbars_count = 0 - --- table which records which HUD bar slots have been “registered” so far; used for automatic positioning -hb.registered_slots = {} - -hb.settings = {} +hb = { + hudtables = {}, + -- number of registered HUD bars + hudbars_count = 0, + -- table which records which HUD bar slots have been “registered” so far; used for automatic positioning + registered_slots = {}, + settings = {}, + -- Table which contains all players with active default HUD bars (only for internal use) + players = {}, +} function hb.load_setting(sname, stype, defaultval, valid_values) local sval @@ -45,7 +50,8 @@ function hb.load_setting(sname, stype, defaultval, valid_values) end -- Load default settings -dofile(minetest.get_modpath("hudbars").."/default_settings.lua") +dofile(modpath.."/default_settings.lua") + if minetest.get_modpath("mcl_experience") and not minetest.is_creative_enabled("") then -- reserve some space for experience bar: hb.settings.start_offset_left.y = hb.settings.start_offset_left.y - 20 @@ -85,9 +91,6 @@ local function make_label(format_string, format_string_config, label, start_valu return ret end --- Table which contains all players with active default HUD bars (only for internal use) -hb.players = {} - function hb.value_to_barlength(value, max) if max == 0 then return 0 From ee9577b62597bab6368b66bf32985f03f7c6da5d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 26 May 2021 16:43:36 +0200 Subject: [PATCH 28/38] fix functions in mcl_hbarmor --- mods/HUD/mcl_hbarmor/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/HUD/mcl_hbarmor/init.lua b/mods/HUD/mcl_hbarmor/init.lua index 9e5aa634b..f8fa6e619 100644 --- a/mods/HUD/mcl_hbarmor/init.lua +++ b/mods/HUD/mcl_hbarmor/init.lua @@ -21,11 +21,11 @@ if tonumber(set) ~= nil then end -local must_hide = function(playername, arm) +local function must_hide(playername, arm) return arm == 0 end -local arm_printable = function(arm) +local function arm_printable(arm) return math.ceil(math.floor(arm+0.5)) end From 5fc3256930545d28eca105eec0ec785558e39b1b Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 26 May 2021 16:55:32 +0200 Subject: [PATCH 29/38] fix codestyle in mcl_hbarmor --- mods/HUD/mcl_hbarmor/init.lua | 36 +++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/mods/HUD/mcl_hbarmor/init.lua b/mods/HUD/mcl_hbarmor/init.lua index f8fa6e619..422a409fb 100644 --- a/mods/HUD/mcl_hbarmor/init.lua +++ b/mods/HUD/mcl_hbarmor/init.lua @@ -1,23 +1,26 @@ -local S = minetest.get_translator("mcl_hbarmor") +local S = minetest.get_translator(minetest.get_current_modname()) -local mcl_hbarmor = {} +local math = math +local tonumber = tonumber --- HUD statbar values -mcl_hbarmor.armor = {} +local get_connected_players = minetest.get_connected_players --- Stores if player's HUD bar has been initialized so far. -mcl_hbarmor.player_active = {} +local mcl_hbarmor = { + -- HUD statbar values + armor = {}, + -- Stores if player's HUD bar has been initialized so far. + player_active = {}, + -- Time difference in seconds between updates to the HUD armor bar. + -- Increase this number for slow servers. + tick = 0.1, + -- If true, the armor bar is hidden when the player does not wear any armor + autohide = true, +} --- Time difference in seconds between updates to the HUD armor bar. --- Increase this number for slow servers. -mcl_hbarmor.tick = 0.1 +local tick_config = minetest.settings:get("mcl_hbarmor_tick") --- If true, the armor bar is hidden when the player does not wear any armor -mcl_hbarmor.autohide = true - -set = minetest.settings:get("mcl_hbarmor_tick") -if tonumber(set) ~= nil then - mcl_hbarmor.tick = tonumber(set) +if tonumber(tick_config) ~= nil then + mcl_hbarmor.tick = tonumber(tick_config) end @@ -106,12 +109,13 @@ end) local main_timer = 0 local timer = 0 minetest.register_globalstep(function(dtime) + --TODO: replace this by playerglobalstep API then implemented 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 - for _,player in pairs(minetest.get_connected_players()) do + for _,player in pairs(get_connected_players()) do local name = player:get_player_name() if mcl_hbarmor.player_active[name] == true then local ret = mcl_hbarmor.get_armor(player) From bb77443892805a39471bc7d2776639cd2b72c87f Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 26 May 2021 17:43:42 +0000 Subject: [PATCH 30/38] [mcl_core] fix function codestyle in functions.lua --- mods/ITEMS/mcl_core/functions.lua | 36 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 7f9a83bc9..f66240b94 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -53,7 +53,7 @@ minetest.register_abm({ -- -- Functions -mcl_core.grow_cactus = function(pos, node) +function mcl_core.grow_cactus(pos, node) pos.y = pos.y-1 local name = minetest.get_node(pos).name if minetest.get_item_group(name, "sand") ~= 0 then @@ -71,7 +71,7 @@ mcl_core.grow_cactus = function(pos, node) end end -mcl_core.grow_reeds = function(pos, node) +function mcl_core.grow_reeds(pos, node) pos.y = pos.y-1 local name = minetest.get_node(pos).name if minetest.get_item_group(name, "soil_sugarcane") ~= 0 then @@ -114,8 +114,8 @@ local function drop_attached_node(p) end -- Helper function for node actions for liquid flow -local liquid_flow_action = function(pos, group, action) - local check_detach = function(pos, xp, yp, zp) +local function liquid_flow_action(pos, group, action) + local function check_detach(pos, xp, yp, zp) local p = {x=pos.x+xp, y=pos.y+yp, z=pos.z+zp} local n = minetest.get_node_or_nil(p) if not n then @@ -594,13 +594,13 @@ function mcl_core.generate_v6_spruce_tree(pos) vm:write_to_map() end -mcl_core.generate_spruce_tree = function(pos) +function mcl_core.generate_spruce_tree(pos) local r = math.random(1, 3) local path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_spruce_"..r..".mts" minetest.place_schematic({ x = pos.x - 3, y = pos.y - 1, z = pos.z - 3 }, path, "0", nil, false) end -mcl_core.generate_huge_spruce_tree = function(pos) +function mcl_core.generate_huge_spruce_tree(pos) local r1 = math.random(1, 2) local r2 = math.random(1, 4) local path @@ -911,7 +911,7 @@ minetest.register_lbm({ -------------------------- local treelight = 9 -local sapling_grow_action = function(tree_id, soil_needed, one_by_one, two_by_two, sapling) +local function sapling_grow_action(tree_id, soil_needed, one_by_one, two_by_two, sapling) return function(pos) local meta = minetest.get_meta(pos) if meta:get("grown") then return end @@ -953,7 +953,7 @@ local sapling_grow_action = function(tree_id, soil_needed, one_by_one, two_by_tw -- This sapling grows in a special way when there are 4 saplings in a 2×2 pattern if two_by_two then -- Check 8 surrounding saplings and try to find a 2×2 pattern - local is_sapling = function(pos, sapling) + local function is_sapling(pos, sapling) return minetest.get_node(pos).name == sapling end local p2 = {x=pos.x+1, y=pos.y, z=pos.z} @@ -1040,7 +1040,7 @@ local grow_birch = sapling_grow_action(BIRCH_TREE_ID, 1, true, false) -- pos: Position -- node: Node table of the node at this position, from minetest.get_node -- Returns true on success and false on failure -mcl_core.grow_sapling = function(pos, node) +function mcl_core.grow_sapling(pos, node) local grow if node.name == "mcl_core:sapling" then grow = grow_oak @@ -1245,7 +1245,7 @@ minetest.register_abm({ end -- Add vines below pos (if empty) - local spread_down = function(origin, target, dir, node) + local function spread_down(origin, target, dir, node) if math.random(1, 2) == 1 then if minetest.get_node(target).name == "air" then minetest.add_node(target, {name = "mcl_core:vine", param2 = node.param2}) @@ -1254,7 +1254,7 @@ minetest.register_abm({ end -- Add vines above pos if it is backed up - local spread_up = function(origin, target, dir, node) + local function spread_up(origin, target, dir, node) local vines_in_area = minetest.find_nodes_in_area({x=origin.x-4, y=origin.y-1, z=origin.z-4}, {x=origin.x+4, y=origin.y+1, z=origin.z+4}, "mcl_core:vine") -- Less then 4 vines blocks around the ticked vines block (remember the ticked block is counted by above function as well) if #vines_in_area < 5 then @@ -1273,7 +1273,7 @@ minetest.register_abm({ end end - local spread_horizontal = function(origin, target, dir, node) + local function spread_horizontal(origin, target, dir, node) local vines_in_area = minetest.find_nodes_in_area({x=origin.x-4, y=origin.y-1, z=origin.z-4}, {x=origin.x+4, y=origin.y+1, z=origin.z+4}, "mcl_core:vine") -- Less then 4 vines blocks around the ticked vines block (remember the ticked block is counted by above function as well) if #vines_in_area < 5 then @@ -1310,7 +1310,7 @@ minetest.register_abm({ }) -- Returns true of the node supports vines -mcl_core.supports_vines = function(nodename) +function mcl_core.supports_vines(nodename) local def = minetest.registered_nodes[nodename] -- Rules: 1) walkable 2) full cube return def.walkable and @@ -1530,7 +1530,7 @@ end -- -- The snowable nodes also MUST have _mcl_snowed defined to contain the name -- of the snowed node. -mcl_core.register_snowed_node = function(itemstring_snowed, itemstring_clear, tiles, sounds, clear_colorization, desc) +function mcl_core.register_snowed_node(itemstring_snowed, itemstring_clear, tiles, sounds, clear_colorization, desc) local def = table.copy(minetest.registered_nodes[itemstring_clear]) local create_doc_alias if def.description then @@ -1593,7 +1593,7 @@ end -- Reverts a snowed dirtlike node at pos to its original snow-less form. -- This function assumes there is no snow cover node above. This function -- MUST NOT be called if there is a snow cover node above pos. -mcl_core.clear_snow_dirt = function(pos, node) +function mcl_core.clear_snow_dirt(pos, node) local def = minetest.registered_nodes[node.name] if def._mcl_snowless then minetest.swap_node(pos, {name = def._mcl_snowless, param2=node.param2}) @@ -1605,7 +1605,7 @@ end -- on_construct -- Makes constructed snowable node snowed if placed below a snow cover node. -mcl_core.on_snowable_construct = function(pos) +function mcl_core.on_snowable_construct(pos) -- Myself local node = minetest.get_node(pos) @@ -1633,7 +1633,7 @@ end -- on_construct -- Makes snowable node below snowed. -mcl_core.on_snow_construct = function(pos) +function mcl_core.on_snow_construct(pos) local npos = {x=pos.x, y=pos.y-1, z=pos.z} local node = minetest.get_node(npos) local def = minetest.registered_nodes[node.name] @@ -1643,7 +1643,7 @@ mcl_core.on_snow_construct = function(pos) end -- after_destruct -- Clears snowed dirtlike node below. -mcl_core.after_snow_destruct = function(pos) +function mcl_core.after_snow_destruct(pos) local nn = minetest.get_node(pos).name -- No-op if snow was replaced with snow if minetest.get_item_group(nn, "snow_cover") == 1 then From 211b078d3a112c47be808afe313247c8aafc5868 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 26 May 2021 17:51:24 +0000 Subject: [PATCH 31/38] [mcl_core] fix function codestyle in nodes_base.lua --- mods/ITEMS/mcl_core/nodes_base.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 39015e53b..9baa6c33e 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -86,7 +86,7 @@ minetest.register_node("mcl_core:stone_with_gold", { }) local redstone_timer = 68.28 -local redstone_ore_activate = function(pos) +local function redstone_ore_activate(pos) minetest.swap_node(pos, {name="mcl_core:stone_with_redstone_lit"}) local t = minetest.get_node_timer(pos) t:start(redstone_timer) @@ -124,7 +124,7 @@ minetest.register_node("mcl_core:stone_with_redstone", { } }) -local redstone_ore_reactivate = function(pos) +local function redstone_ore_reactivate(pos) local t = minetest.get_node_timer(pos) t:start(redstone_timer) end @@ -864,7 +864,7 @@ minetest.register_node("mcl_core:packed_ice", { -- Frosted Ice (4 nodes) for i=0,3 do local ice = {} - ice.increase_age = function(pos, ice_near, first_melt) + function ice.increase_age(pos, ice_near, first_melt) -- Increase age of frosted age or turn to water source if too old local nn = minetest.get_node(pos).name local age = tonumber(string.sub(nn, -1)) From 5b433038732317304c91fa3b78505b6ebd2910ce Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 26 May 2021 17:54:58 +0000 Subject: [PATCH 32/38] [mcl_core] fix function codestyle in nodes_climb.lua --- mods/ITEMS/mcl_core/nodes_climb.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 3b2d3ab60..ad861b4f2 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -1,7 +1,7 @@ -- Climbable nodes local S = minetest.get_translator("mcl_core") -local rotate_climbable = function(pos, node, user, mode) +local function rotate_climbable(pos, node, user, mode) if mode == screwdriver.ROTATE_FACE then local r = screwdriver.rotate.wallmounted(pos, node, mode) node.param2 = r From 90bab9026b5f7c2b89a930368d0784f1d67f0857 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 26 May 2021 17:57:43 +0000 Subject: [PATCH 33/38] [mcl_core] fix function codestyle in nodes_liquid.lua --- mods/ITEMS/mcl_core/nodes_liquid.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 99d33cf59..42276685e 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -212,7 +212,7 @@ S("• When lava is directly above water, the water turns into stone."), _mcl_hardness = -1, }) -local emit_lava_particle = function(pos) +local function emit_lava_particle(pos) local node = minetest.get_node(pos) if minetest.get_item_group(node.name, "lava_source") == 0 then return From 656891ec61412f64e3339d24e19b95954c56078a Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 26 May 2021 18:02:28 +0000 Subject: [PATCH 34/38] [mcl_core] fix function codestyle in nodes_trees.lua --- mods/ITEMS/mcl_core/nodes_trees.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_trees.lua b/mods/ITEMS/mcl_core/nodes_trees.lua index cc64cd9cf..a72935f05 100644 --- a/mods/ITEMS/mcl_core/nodes_trees.lua +++ b/mods/ITEMS/mcl_core/nodes_trees.lua @@ -8,7 +8,7 @@ if mod_screwdriver then end -- Register tree trunk (wood) and bark -local register_tree_trunk = function(subname, description_trunk, description_bark, longdesc, tile_inner, tile_bark, stripped_varient) +local function register_tree_trunk(subname, description_trunk, description_bark, longdesc, tile_inner, tile_bark, stripped_varient) minetest.register_node("mcl_core:"..subname, { description = description_trunk, _doc_items_longdesc = longdesc, @@ -91,7 +91,7 @@ local register_stripped_trunk = function(subname, description_stripped_trunk, de }) end -local register_wooden_planks = function(subname, description, tiles) +local function register_wooden_planks(subname, description, tiles) minetest.register_node("mcl_core:"..subname, { description = description, _doc_items_longdesc = doc.sub.items.temp.build, @@ -106,7 +106,7 @@ local register_wooden_planks = function(subname, description, tiles) }) end -local register_leaves = function(subname, description, longdesc, tiles, sapling, drop_apples, sapling_chances, leafdecay_distance) +local function register_leaves(subname, description, longdesc, tiles, sapling, drop_apples, sapling_chances, leafdecay_distance) if leafdecay_distance == nil then leafdecay_distance = 4 end @@ -173,7 +173,7 @@ local register_leaves = function(subname, description, longdesc, tiles, sapling, }) end -local register_sapling = function(subname, description, longdesc, tt_help, texture, selbox) +local function register_sapling(subname, description, longdesc, tt_help, texture, selbox) minetest.register_node("mcl_core:"..subname, { description = description, _tt_help = tt_help, From 1b0d6a2c2dffe94022c42892e84fbeb9c34b4c71 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 26 May 2021 20:48:00 +0200 Subject: [PATCH 35/38] Fix timing out of assist death message sources --- mods/HUD/mcl_death_messages/init.lua | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 0432c3488..107daa2a3 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -237,12 +237,10 @@ mcl_damage.register_on_damage(function(obj, damage, reason) end) minetest.register_globalstep(function(dtime) - local new_assist = {} - for obj, tbl in pairs(mcl_death_messages.assist) do tbl.timeout = tbl.timeout - dtime - if (obj:is_player() or obj:get_luaentity()) and tbl.timeout > 0 then - new_assist[obj] = tbl + if not obj:is_player() and not obj:get_luaentity() or tbl.timeout > 0 then + mcl_death_messages.assist[obj] = nil end end end) From 772f48ed58d81c44b6a9dbbb7cbfb2ad274deacc Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 26 May 2021 20:51:39 +0200 Subject: [PATCH 36/38] Fix crash / luacheck warning caused by armor with thorns level > 10 --- mods/ITEMS/mcl_armor/damage.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor/damage.lua b/mods/ITEMS/mcl_armor/damage.lua index f17033495..ed616397d 100644 --- a/mods/ITEMS/mcl_armor/damage.lua +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -68,7 +68,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) if do_irregular_damage or thorns_damage_regular < 4 and math.random() < enchantments.thorns * 0.15 then if do_irregular_damage then - thorns_damage_irregular = thorns_damage_irregular + throrns_level - 10 + thorns_damage_irregular = thorns_damage_irregular + enchantments.thorns - 10 else thorns_damage_regular = math.min(4, thorns_damage_regular + math.random(4)) end From c57ead698591ea205d184e6a84b760816daaadce Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 26 May 2021 20:56:00 +0200 Subject: [PATCH 37/38] Use next() instead of one-time loop to fix luacheck warning in mcl_util.calculate_durability --- mods/CORE/mcl_util/init.lua | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 1ac2c1f9b..a7504af08 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -456,12 +456,7 @@ function mcl_util.calculate_durability(itemstack) end end end - if not uses then - for _, v in pairs(itemstack:get_tool_capabilities().groupcaps) do - uses = v.uses - break - end - end + uses = uses or (next(itemstack:get_tool_capabilities().groupcaps) or {}).uses end return uses or 0 From 138a3cd154ac6498cb4f829bd39390579bb383f0 Mon Sep 17 00:00:00 2001 From: epCode Date: Wed, 26 May 2021 19:13:30 -0700 Subject: [PATCH 38/38] Add in header blend file --- menu/Header.blend | Bin 0 -> 1670380 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 menu/Header.blend diff --git a/menu/Header.blend b/menu/Header.blend new file mode 100644 index 0000000000000000000000000000000000000000..78a9f6158d1bde99a24376353485d5becf84dd73 GIT binary patch literal 1670380 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

xSva)lF}pN%_&W7%aM24_cW_dSHbz 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