From 725dc731ddc2a6f1cf1a20832e06883613d5974a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 11 Apr 2021 11:58:33 -0400 Subject: [PATCH 001/176] Adjust mob collision detection - this breaks a lot of things and will be fixed later --- mods/ENTITIES/mcl_mobs/api.lua | 142 ++++++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 6c1a0567ec..ad60a508db 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -210,7 +210,21 @@ local do_attack = function(self, player) end + + +------------------------------------------------------------------------------------------------------------------------------------ + + + + + + + + + + -- collision function borrowed amended from jordan4ibanez open_ai mod +--[[ local collision = function(self) local pos = self.object:get_pos() @@ -237,6 +251,120 @@ local collision = function(self) return({x,z}) end +]]-- + +local collision = function(self) + pos = self.object:get_pos() + --do collision detection from the base of the mob + + collisionbox = self.object:get_properties().collisionbox + + pos.y = pos.y + collisionbox[2] + + collision_boundary = collisionbox[4] + + radius = collision_boundary + + if collisionbox[5] > collision_boundary then + radius = collisionbox[5] + end + + collision_count = 0 + + for _,object in ipairs(minetest.get_objects_inside_radius(pos, radius*1.25)) do + if object ~= self.object and (object:is_player() or object:get_luaentity()._cmi_is_mob == true) 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 self.object:get_attach() or (self.object:get_attach() and self.object:get_attach() ~= object)) then + --stop infinite loop + collision_count = collision_count + 1 + if collision_count > 100 then + break + end + pos2 = object:get_pos() + + object_collisionbox = object:get_properties().collisionbox + + pos2.y = pos2.y + object_collisionbox[2] + + object_collision_boundary = object_collisionbox[4] + + + --this is checking the difference of the object collided with's possision + --if positive top of other object is inside (y axis) of current object + y_base_diff = (pos2.y + object_collisionbox[5]) - pos.y + + y_top_diff = (pos.y + collisionbox[5]) - pos2.y + + + distance = vector.distance(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z)) + + if distance <= collision_boundary + object_collision_boundary and y_base_diff >= 0 and y_top_diff >= 0 then + + dir = vector.direction(pos,pos2) + dir.y = 0 + + --eliminate mob being stuck in corners + if dir.x == 0 and dir.z == 0 then + dir = vector.new(math.random(-1,1)*math.random(),0,math.random(-1,1)*math.random()) + end + + local velocity = vector.multiply(dir,1.1) + + --local velocity = vector.normalize(dir) + + vel1 = vector.multiply(velocity, -1) + vel2 = velocity + + self.object:add_velocity(vel1) + + if object:is_player() then + object:add_player_velocity(vel2) + + --if self.on_fire then + -- start_fire(object) + --end + + --if is_player_on_fire(object) then + -- start_fire(self.object) + --end + + else + object:add_velocity(vel2) + --if self.on_fire then + -- start_fire(object) + --end + --if object:get_luaentity().on_fire then + -- start_fire(self.object) + --end + end + end + end + end +end + + + + + + + + + + + + +------------------------------------------------------------------------------------------------------------------------------------ + + + + + + + + + + -- move mob in facing direction local set_velocity = function(self, v) @@ -244,9 +372,9 @@ local set_velocity = function(self, v) local c_x, c_y = 0, 0 -- can mob be pushed, if so calculate direction - if self.pushable then - c_x, c_y = unpack(collision(self)) - end + --if self.pushable then + --c_x, c_y = unpack(collision(self)) + --end -- halt mob if it has been ordered to stay if self.order == "stand" then @@ -256,11 +384,17 @@ local set_velocity = function(self, v) local yaw = (self.object:get_yaw() or 0) + self.rotate - self.object:set_velocity({ + self.object:add_velocity({ x = (sin(yaw) * -v) + c_x, y = self.object:get_velocity().y, z = (cos(yaw) * v) + c_y, }) + + if self.pushable then + --c_x, c_y = unpack(collision(self)) + + collision(self) + end end From 2456e3cd1ef6954415e4a771bb704a12364895eb Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 11 Apr 2021 12:52:31 -0400 Subject: [PATCH 002/176] Adjust math localizations in api.lua --- mods/ENTITIES/mcl_mobs/api.lua | 235 ++++++++++++++++----------------- 1 file changed, 115 insertions(+), 120 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index ad60a508db..37a1cc4732 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1,9 +1,23 @@ +-- API for Mobs Redo: MineClone 2 Delux 2.0 DRM Free Early Access Super Extreme Edition + +-- current state of things: "why are these not in the same table as those?", and, "why are these not localized?" + +-- lua locals + +-- 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 + --- API for Mobs Redo: MineClone 2 Edition (MRM) mobs = {} -mobs.mod = "mrm" -mobs.version = "20210106" -- don't rely too much on this, rarely updated, if ever local MAX_MOB_NAME_LENGTH = 30 local HORNY_TIME = 30 @@ -40,21 +54,13 @@ function mobs.is_creative(name) end --- localize math functions -local pi = math.pi -local sin = math.sin -local cos = math.cos -local abs = math.abs -local min = math.min -local max = math.max -local atann = math.atan -local random = math.random -local floor = math.floor + + local atan = function(x) if not x or x ~= x then return 0 else - return atann(x) + return math_atan(x) end end @@ -157,7 +163,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, @@ -204,7 +210,7 @@ local do_attack = function(self, player) self.state = "attack" -- TODO: Implement war_cry sound without being annoying - --if random(0, 100) < 90 then + --if math_random(0, 100) < 90 then --mob_sound(self, "war_cry", true) --end end @@ -306,7 +312,7 @@ local collision = function(self) --eliminate mob being stuck in corners if dir.x == 0 and dir.z == 0 then - dir = vector.new(math.random(-1,1)*math.random(),0,math.random(-1,1)*math.random()) + dir = vector.new(math_random(-1,1)*math_random(),0,math_random(-1,1)*math_random()) end local velocity = vector.multiply(dir,1.1) @@ -385,9 +391,9 @@ local set_velocity = function(self, v) local yaw = (self.object:get_yaw() or 0) + self.rotate self.object:add_velocity({ - x = (sin(yaw) * -v) + c_x, + x = (math_sin(yaw) * -v) + c_x, y = self.object:get_velocity().y, - z = (cos(yaw) * v) + c_y, + z = (math_cos(yaw) * v) + c_y, }) if self.pushable then @@ -415,13 +421,13 @@ local function update_roll(self) local was_Fleckenstein = false local rot = self.object:get_rotation() - rot.z = is_Fleckenstein and pi or 0 + rot.z = is_Fleckenstein and math_pi or 0 self.object:set_rotation(rot) local cbox = table.copy(self.collisionbox) local acbox = self.object:get_properties().collisionbox - if math.abs(cbox[2] - acbox[2]) > 0.1 then + if math_abs(cbox[2] - acbox[2]) > 0.1 then was_Fleckenstein = true end @@ -449,7 +455,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.object:set_yaw(yaw) update_roll(self) @@ -718,7 +724,7 @@ local damage_effect = function(self, damage) -- damage particles if (not disable_blood) and damage > 0 then - local amount_large = math.floor(damage / 2) + local amount_large = math_floor(damage / 2) local amount_small = damage % 2 local pos = self.object:get_pos() @@ -748,8 +754,8 @@ 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=pi/2}) - max = vector.rotate(max, {x=0, y=yaw, z=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) @@ -837,14 +843,14 @@ local item_drop = function(self, cooked, looting_level) local num = 0 local do_common_looting = (looting_level > 0 and looting_type == "common") - if random() < chance then - num = random(dropdef.min or 1, dropdef.max or 1) + if math_random() < chance then + num = math_random(dropdef.min or 1, dropdef.max or 1) elseif not dropdef.looting_ignore_chance then do_common_looting = false end if do_common_looting then - num = num + math.floor(math.random(0, looting_level) + 0.5) + num = num + math_floor(math_random(0, looting_level) + 0.5) end if num > 0 then @@ -869,9 +875,9 @@ local item_drop = function(self, cooked, looting_level) if obj and obj:get_luaentity() then obj:set_velocity({ - x = random(-10, 10) / 9, + x = math_random(-10, 10) / 9, y = 6, - z = random(-10, 10) / 9, + z = math_random(-10, 10) / 9, }) elseif obj then obj:remove() -- item does not exist @@ -953,7 +959,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 @@ -1018,7 +1024,7 @@ local check_for_death = function(self, cause, cmi_cause) set_animation(self, "die") else local rot = self.object:get_rotation() - rot.z = pi/2 + rot.z = math_pi/2 self.object:set_rotation(rot) length = 1 + DEATH_DELAY set_animation(self, "stand", true) @@ -1084,8 +1090,8 @@ local is_at_cliff_or_danger = function(self) return false end local yaw = self.object:get_yaw() - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) local pos = self.object:get_pos() local ypos = pos.y + self.collisionbox[2] -- just above floor @@ -1119,8 +1125,8 @@ local is_at_water_danger = function(self) return false end local yaw = self.object:get_yaw() - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) local pos = self.object:get_pos() local ypos = pos.y + self.collisionbox[2] -- just above floor @@ -1337,7 +1343,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 @@ -1355,7 +1361,7 @@ local do_env_damage = function(self) return true end else - self.breath = math.min(self.breath_max, self.breath + 1) + self.breath = math_min(self.breath_max, self.breath + 1) end end @@ -1426,8 +1432,8 @@ local do_jump = function(self) end -- where is front - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) -- what is in front of mob? nod = node_ok({ @@ -1527,7 +1533,7 @@ local entity_physics = function(pos, radius) dist = vector.distance(pos, obj_pos) if dist < 1 then dist = 1 end - local damage = floor((4 / dist) * radius) + local damage = math_floor((4 / dist) * radius) local ent = objs[n]:get_luaentity() -- punches work on entities AND players @@ -1682,7 +1688,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 @@ -1699,7 +1705,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 @@ -1730,7 +1736,7 @@ local replace = function(self, pos) or not self.replace_what or self.child == true or self.object:get_velocity().y ~= 0 - or random(1, self.replace_rate) > 1 then + or math_random(1, self.replace_rate) > 1 then return end @@ -1738,7 +1744,7 @@ local replace = function(self, pos) if type(self.replace_what[1]) == "table" then - local num = 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 "" @@ -1800,7 +1806,7 @@ local smart_mobs = function(self, s, p, dist, dtime) local target_pos = self.attack:get_pos() -- is it becoming stuck? - if abs(s1.x - s.x) + abs(s1.z - s.z) < .5 then + if math_abs(s1.x - s.x) + math_abs(s1.z - s.z) < .5 then self.path.stuck_timer = self.path.stuck_timer + dtime else self.path.stuck_timer = 0 @@ -1861,7 +1867,7 @@ local smart_mobs = function(self, s, p, dist, dtime) end, self) end - if math.abs(vector.subtract(s,target_pos).y) > self.stepheight then + if math_abs(vector.subtract(s,target_pos).y) > self.stepheight then if height_switcher then use_pathfind = true @@ -1881,8 +1887,8 @@ local smart_mobs = function(self, s, p, dist, dtime) -- round position to center of node to avoid stuck in walls -- also adjust height for player models! - s.x = floor(s.x + 0.5) - s.z = floor(s.z + 0.5) + s.x = math_floor(s.x + 0.5) + s.z = math_floor(s.z + 0.5) local ssight, sground = minetest.line_of_sight(s, { x = s.x, y = s.y - 4, z = s.z}, 1) @@ -1894,9 +1900,9 @@ local smart_mobs = function(self, s, p, dist, dtime) local p1 = self.attack:get_pos() - p1.x = floor(p1.x + 0.5) - p1.y = floor(p1.y + 0.5) - p1.z = floor(p1.z + 0.5) + p1.x = math_floor(p1.x + 0.5) + p1.y = math_floor(p1.y + 0.5) + p1.z = math_floor(p1.z + 0.5) local dropheight = 12 if self.fear_height ~= 0 then dropheight = self.fear_height end @@ -1962,11 +1968,11 @@ local smart_mobs = function(self, s, p, dist, dtime) else -- dig 2 blocks to make door toward player direction - local yaw1 = self.object:get_yaw() + pi / 2 + local yaw1 = self.object:get_yaw() + math_pi / 2 local p1 = { - x = s.x + cos(yaw1), + x = s.x + math_cos(yaw1), y = s.y, - z = s.z + sin(yaw1) + z = s.z + math_sin(yaw1) } if not minetest.is_protected(p1, "") then @@ -2244,10 +2250,10 @@ local runaway_from = function(self) z = lp.z - s.z } - local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate + local yaw = (atan(vec.z / vec.x) + 3 * math_pi / 2) - self.rotate if lp.x > s.x then - yaw = yaw + pi + yaw = yaw + math_pi end yaw = set_yaw(self, yaw, 4) @@ -2336,9 +2342,9 @@ local follow_flop = function(self) z = p.z - s.z } - local yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + local yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if p.x > s.x then yaw = yaw + pi end + if p.x > s.x then yaw = yaw + math_pi end set_yaw(self, yaw, 2.35) @@ -2374,9 +2380,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 @@ -2428,7 +2434,7 @@ local do_states = function(self, dtime) if self.state == "stand" then - if random(1, 4) == 1 then + if math_random(1, 4) == 1 then local lp = nil local s = self.object:get_pos() @@ -2450,11 +2456,11 @@ local do_states = function(self, dtime) z = lp.z - s.z } - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if lp.x > s.x then yaw = yaw + pi end + if lp.x > s.x then yaw = yaw + math_pi end else - yaw = yaw + random(-0.5, 0.5) + yaw = yaw + math_random(-0.5, 0.5) end yaw = set_yaw(self, yaw, 8) @@ -2469,7 +2475,7 @@ local do_states = function(self, dtime) if self.walk_chance ~= 0 and self.facing_fence ~= true - and 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) @@ -2519,7 +2525,7 @@ local do_states = function(self, dtime) {x = s.x + 5, y = s.y + 1, z = s.z + 5}, {"group:solid"}) - lp = #lp > 0 and lp[random(#lp)] + lp = #lp > 0 and lp[math_random(#lp)] -- did we find land? if lp then @@ -2529,10 +2535,10 @@ local do_states = function(self, dtime) z = lp.z - s.z } - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if lp.x > s.x then yaw = yaw + pi end + if lp.x > s.x then yaw = yaw + math_pi end -- look towards land and move in that direction yaw = set_yaw(self, yaw, 6) @@ -2545,8 +2551,8 @@ local do_states = function(self, dtime) else -- Randomly turn - if random(1, 100) <= 30 then - yaw = yaw + 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 @@ -2554,9 +2560,9 @@ local do_states = function(self, dtime) yaw = set_yaw(self, yaw, 8) -- otherwise randomly turn - elseif random(1, 100) <= 30 then + elseif math_random(1, 100) <= 30 then - yaw = yaw + random(-0.5, 0.5) + yaw = yaw + math_random(-0.5, 0.5) yaw = set_yaw(self, yaw, 8) end @@ -2567,7 +2573,7 @@ local do_states = function(self, dtime) end if self.facing_fence == true or cliff_or_danger - or random(1, 100) <= 30 then + or math_random(1, 100) <= 30 then set_velocity(self, 0) self.state = "stand" @@ -2642,9 +2648,9 @@ local do_states = function(self, dtime) z = p.z - s.z } - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if p.x > s.x then yaw = yaw + pi end + if p.x > s.x then yaw = yaw + math_pi end yaw = set_yaw(self, yaw, 0, dtime) @@ -2738,9 +2744,9 @@ local do_states = function(self, dtime) and dist > self.reach then local p1 = s - local me_y = floor(p1.y) + local me_y = math_floor(p1.y) local p2 = p - local p_y = floor(p2.y + 1) + local p_y = math_floor(p2.y + 1) local v = self.object:get_velocity() if flight_check(self, s) then @@ -2801,7 +2807,7 @@ local do_states = function(self, dtime) return end - if abs(p1.x-s.x) + abs(p1.z - s.z) < 0.6 then + if math_abs(p1.x-s.x) + math_abs(p1.z - s.z) < 0.6 then -- reached waypoint, remove it from queue table.remove(self.path.way, 1) end @@ -2815,9 +2821,9 @@ local do_states = function(self, dtime) z = p.z - s.z } - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if p.x > s.x then yaw = yaw + pi end + if p.x > s.x then yaw = yaw + math_pi end yaw = set_yaw(self, yaw, 0, dtime) @@ -2867,7 +2873,7 @@ local do_states = function(self, dtime) self.timer = 0 if self.double_melee_attack - and random(1, 2) == 1 then + and math_random(1, 2) == 1 then set_animation(self, "punch2") else set_animation(self, "punch") @@ -2920,9 +2926,9 @@ local do_states = function(self, dtime) z = p.z - s.z } - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if p.x > s.x then yaw = yaw + pi end + if p.x > s.x then yaw = yaw + math_pi end yaw = set_yaw(self, yaw, 0, dtime) @@ -2934,7 +2940,7 @@ local do_states = function(self, dtime) if self.shoot_interval and self.timer > self.shoot_interval and not minetest.raycast(p, self.attack:get_pos(), false, false):next() - and random(1, 100) <= 60 then + and math_random(1, 100) <= 60 then self.timer = 0 set_animation(self, "shoot") @@ -3038,7 +3044,7 @@ local falling = function(self, pos) self.object:set_acceleration({ x = 0, - y = -self.fall_speed / (max(1, v.y) ^ 2), + y = -self.fall_speed / (math_max(1, v.y) ^ 2), z = 0 }) end @@ -3057,7 +3063,7 @@ local falling = function(self, pos) if add ~= 0 then damage = damage + damage * (add/100) end - damage = floor(damage) + damage = math_floor(damage) if damage > 0 then self.health = self.health - damage @@ -3171,7 +3177,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- healing if damage <= -1 then - self.health = self.health - floor(damage) + self.health = self.health - math_floor(damage) return end @@ -3198,7 +3204,7 @@ local 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 = 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 @@ -3214,7 +3220,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- weapon sounds if weapon:get_definition().sounds ~= nil then - local s = random(0, #weapon:get_definition().sounds) + local s = math_random(0, #weapon:get_definition().sounds) minetest.sound_play(weapon:get_definition().sounds[s], { object = self.object, --hitter, @@ -3243,7 +3249,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) and tflp >= punch_interval then local v = self.object:get_velocity() - local r = 1.4 - min(punch_interval, 1.4) + local r = 1.4 - math_min(punch_interval, 1.4) local kb = r * 2.0 local up = 2 @@ -3296,10 +3302,10 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) z = lp.z - s.z } - local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate + local yaw = (atan(vec.z / vec.x) + 3 * math_pi / 2) - self.rotate if lp.x > s.x then - yaw = yaw + pi + yaw = yaw + math_pi end yaw = set_yaw(self, yaw, 6) @@ -3440,7 +3446,7 @@ local mob_activate = function(self, staticdata, def, dtime) def.textures = {def.textures} end - self.base_texture = def.textures[random(1, #def.textures)] + self.base_texture = def.textures[math_random(1, #def.textures)] self.base_mesh = def.mesh self.base_size = self.visual_size self.base_colbox = self.collisionbox @@ -3502,7 +3508,7 @@ local mob_activate = function(self, staticdata, def, dtime) end if self.health == 0 then - self.health = random (self.hp_min, self.hp_max) + self.health = math_random (self.hp_min, self.hp_max) end if self.breath == nil then self.breath = self.breath_max @@ -3555,7 +3561,7 @@ local mob_activate = function(self, staticdata, def, dtime) -- set anything changed above self.object:set_properties(self) - set_yaw(self, (random(0, 360) - 180) / 180 * pi, 6) + set_yaw(self, (math_random(0, 360) - 180) / 180 * math_pi, 6) update_tag(self) set_animation(self, "stand") @@ -3620,12 +3626,12 @@ local mob_step = function(self, dtime) if self.delay == 1 then yaw = self.target_yaw else - local dif = abs(yaw - self.target_yaw) + local dif = math_abs(yaw - self.target_yaw) if yaw > self.target_yaw then - if dif > pi then - dif = 2 * pi - dif -- need to add + if dif > math_pi then + dif = 2 * math_pi - dif -- need to add yaw = yaw + dif / self.delay else yaw = yaw - dif / self.delay -- need to subtract @@ -3633,21 +3639,21 @@ local mob_step = function(self, dtime) elseif yaw < self.target_yaw then - if dif > pi then - dif = 2 * pi - dif + if dif > math_pi then + dif = 2 * math_pi - dif yaw = yaw - dif / self.delay -- need to subtract else yaw = yaw + dif / self.delay -- need to add end end - if yaw > (pi * 2) then yaw = yaw - (pi * 2) end - if yaw < 0 then yaw = yaw + (pi * 2) end + if yaw > (math_pi * 2) then yaw = yaw - (math_pi * 2) end + if yaw < 0 then yaw = yaw + (math_pi * 2) end end self.delay = self.delay - 1 if self.shaking then - yaw = yaw + (math.random() * 2 - 1) * 5 * dtime + yaw = yaw + (math_random() * 2 - 1) * 5 * dtime end self.object:set_yaw(yaw) update_roll(self) @@ -3690,7 +3696,7 @@ local mob_step = function(self, dtime) end -- mob plays random sound at times - if random(1, 70) == 1 then + if math_random(1, 70) == 1 then mob_sound(self, "random", true) end @@ -3730,11 +3736,11 @@ local mob_step = function(self, dtime) runaway_from(self) if is_at_water_danger(self) and self.state ~= "attack" then - if 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 + random(-0.5, 0.5) + yaw = yaw + math_random(-0.5, 0.5) yaw = set_yaw(self, yaw, 8) end end @@ -3802,7 +3808,7 @@ local mob_step = function(self, dtime) 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 @@ -3880,7 +3886,7 @@ local function scale_difficulty(value, default, min, special) if (not value) or (value == default) or (value == special) then return default else - return max(min, value * difficulty) + return math_max(min, value * difficulty) end end @@ -4084,17 +4090,6 @@ function mobs:register_arrow(name, def) on_punch = function(self) local vel = self.object:get_velocity() self.object:set_velocity({x=vel.x * -1, y=vel.y * -1, z=vel.z * -1}) - end, - collisionbox = def.collisionbox or {0, 0, 0, 0, 0, 0}, - automatic_face_movement_dir = def.rotate - and (def.rotate - (pi / 180)) or false, - - on_activate = def.on_activate, - - on_step = def.on_step or function(self, dtime) - - self.timer = self.timer + 1 - local pos = self.object:get_pos() if self.switch == 0 From 67c40885ef62b4e4e8dcaba3b65c58502c558f7e Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 11 Apr 2021 14:21:19 -0400 Subject: [PATCH 003/176] Fix mobs collision system only running during movement - major overhaul with ai disabled --- mods/ENTITIES/mcl_mobs/api.lua | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 37a1cc4732..e3004d3237 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -374,14 +374,8 @@ end -- move mob in facing direction local set_velocity = function(self, v) - local c_x, c_y = 0, 0 - -- can mob be pushed, if so calculate direction - --if self.pushable then - --c_x, c_y = unpack(collision(self)) - --end - -- halt mob if it has been ordered to stay if self.order == "stand" then self.object:set_velocity({x = 0, y = 0, z = 0}) @@ -395,12 +389,6 @@ local set_velocity = function(self, v) y = self.object:get_velocity().y, z = (math_cos(yaw) * v) + c_y, }) - - if self.pushable then - --c_x, c_y = unpack(collision(self)) - - collision(self) - end end @@ -3587,6 +3575,7 @@ end -- main mob function local mob_step = function(self, dtime) + --[[ if not self.fire_resistant then mcl_burning.tick(self.object, dtime) end @@ -3745,6 +3734,7 @@ local mob_step = function(self, dtime) end end + -- Add water flowing for mobs from mcl_item_entity local p, node, nn, def p = self.object:get_pos() @@ -3756,10 +3746,11 @@ local mob_step = function(self, dtime) -- Move item around on flowing liquids if def and def.liquidtype == "flowing" then - + ]]-- --[[ Get flowing direction (function call from flowlib), if there's a liquid. NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. Luckily, this is exactly what we need if we only care about water, which has this flowing distance. ]] + --[[ local vec = flowlib.quick_flow(p, node) -- Just to make sure we don't manipulate the speed for no reason if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then @@ -3815,6 +3806,13 @@ local mob_step = function(self, dtime) end end end + ]]-- + + -- can mob be pushed, if so calculate direction + if self.pushable then + --c_x, c_y = unpack(collision(self)) + collision(self) + end end From 9aafc28a2009998017753d0aa4d013e3cd8795b6 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 11 Apr 2021 14:47:56 -0400 Subject: [PATCH 004/176] Fix mobs nil check during mob_step --- mods/ENTITIES/mcl_mobs/api.lua | 29 ++++++++++++++++------------- mods/ENTITIES/mcl_mobs/spawning.lua | 1 + 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index e3004d3237..fa3e4ad440 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -324,6 +324,8 @@ local collision = function(self) self.object:add_velocity(vel1) + --reenable fire spreading eventually + if object:is_player() then object:add_player_velocity(vel2) @@ -3575,7 +3577,16 @@ end -- main mob function local mob_step = function(self, dtime) - --[[ + if not self or not self.object or not self.object:get_luaentity() then + return false + end + + -- can mob be pushed, if so calculate direction -- do this first to prevent issues + -- you can push mobs when they're in the dead state + if self.pushable then + collision(self) + end + if not self.fire_resistant then mcl_burning.tick(self.object, dtime) end @@ -3598,9 +3609,11 @@ local mob_step = function(self, dtime) if self.jump_sound_cooloff > 0 then self.jump_sound_cooloff = self.jump_sound_cooloff - dtime end + if self.opinion_sound_cooloff > 0 then self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime end + if falling(self, pos) then -- Return if mob died after falling return @@ -3716,9 +3729,7 @@ local mob_step = function(self, dtime) return end - if not self.object:get_luaentity() then - return false - end + do_jump(self) @@ -3746,11 +3757,10 @@ local mob_step = function(self, dtime) -- Move item around on flowing liquids if def and def.liquidtype == "flowing" then - ]]-- + --[[ Get flowing direction (function call from flowlib), if there's a liquid. NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. Luckily, this is exactly what we need if we only care about water, which has this flowing distance. ]] - --[[ local vec = flowlib.quick_flow(p, node) -- Just to make sure we don't manipulate the speed for no reason if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then @@ -3806,13 +3816,6 @@ local mob_step = function(self, dtime) end end end - ]]-- - - -- can mob be pushed, if so calculate direction - if self.pushable then - --c_x, c_y = unpack(collision(self)) - collision(self) - end end diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index ff52128dfb..f815d88115 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -155,6 +155,7 @@ Overworld regular: local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false +mobs_spawn = false -- count how many mobs of one type are inside an area local count_mobs = function(pos,mobtype) From 00759da39d621b36be6200fa365c51be86dbb99f Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 11 Apr 2021 18:29:32 -0400 Subject: [PATCH 005/176] Unlimit mob ai --- mods/ENTITIES/mcl_mobs/api.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index fa3e4ad440..4578f77c54 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3574,7 +3574,6 @@ local mob_activate = function(self, staticdata, def, dtime) end --- main mob function local mob_step = function(self, dtime) if not self or not self.object or not self.object:get_luaentity() then @@ -3683,14 +3682,17 @@ local mob_step = function(self, dtime) -- attack timer self.timer = self.timer + dtime + --[[ if self.state ~= "attack" then if self.timer < 1 then + print("returning>>error code 1") return end self.timer = 0 end + ]]-- -- never go over 100 if self.timer > 100 then @@ -3729,8 +3731,6 @@ local mob_step = function(self, dtime) return end - - do_jump(self) runaway_from(self) From a564009e4aeda08372b80fb1a5fc2d16f5dfd364 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Mon, 12 Apr 2021 08:11:55 -0400 Subject: [PATCH 006/176] Change HORNY_TIMER to BREED_TIMER --- mods/ENTITIES/mcl_mobs/api.lua | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 4578f77c54..377244a1c0 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -15,13 +15,11 @@ local math_atan = math.atan local math_random = math.random local math_floor = math.floor - - mobs = {} local MAX_MOB_NAME_LENGTH = 30 -local HORNY_TIME = 30 -local HORNY_AGAIN_TIME = 300 +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 @@ -1603,14 +1601,14 @@ local breed = function(self) return end - -- horny animal can mate for HORNY_TIME seconds, - -- afterwards horny animal cannot mate again for HORNY_AGAIN_TIME seconds + -- horny animal can mate for BREED_TIME seconds, + -- afterwards horny animal cannot mate again for BREED_TIME_AGAIN seconds if self.horny == true - and self.hornytimer < HORNY_TIME + HORNY_AGAIN_TIME then + and self.hornytimer < BREED_TIME + BREED_TIME_AGAIN then self.hornytimer = self.hornytimer + 1 - if self.hornytimer >= HORNY_TIME + HORNY_AGAIN_TIME then + if self.hornytimer >= BREED_TIME + BREED_TIME_AGAIN then self.hornytimer = 0 self.horny = false end @@ -1618,7 +1616,7 @@ local breed = function(self) -- find another same animal who is also horny and mate if nearby if self.horny == true - and self.hornytimer <= HORNY_TIME then + and self.hornytimer <= BREED_TIME then local pos = self.object:get_pos() @@ -1657,15 +1655,15 @@ local breed = function(self) if ent and canmate == true and ent.horny == true - and ent.hornytimer <= HORNY_TIME then + and ent.hornytimer <= BREED_TIME then num = num + 1 end -- found your mate? then have a baby if num > 1 then - self.hornytimer = HORNY_TIME + 1 - ent.hornytimer = HORNY_TIME + 1 + self.hornytimer = BREED_TIME + 1 + ent.hornytimer = BREED_TIME + 1 -- spawn baby minetest.after(5, function(parent1, parent2, pos) From adaf74fc5c6354cf2fb1a9f784e5a37a4fb31caa Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Mon, 12 Apr 2021 08:13:11 -0400 Subject: [PATCH 007/176] Remove spacing and delete old collision comments --- mods/ENTITIES/mcl_mobs/api.lua | 67 ---------------------------------- 1 file changed, 67 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 377244a1c0..a59733e5d9 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -52,8 +52,6 @@ function mobs.is_creative(name) end - - local atan = function(x) if not x or x ~= x then return 0 @@ -213,50 +211,6 @@ local do_attack = function(self, player) --end end - - - ------------------------------------------------------------------------------------------------------------------------------------- - - - - - - - - - - --- collision function borrowed amended from jordan4ibanez open_ai mod ---[[ -local collision = function(self) - - local pos = self.object:get_pos() - local vel = self.object:get_velocity() - local x = 0 - local z = 0 - local width = -self.collisionbox[1] + self.collisionbox[4] + 0.5 - - for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do - - if object:is_player() - or (object:get_luaentity()._cmi_is_mob == true and object ~= self.object) then - - local pos2 = object:get_pos() - local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} - local force = (width + 0.5) - vector.distance( - {x = pos.x, y = 0, z = pos.z}, - {x = pos2.x, y = 0, z = pos2.z}) - - x = x + (vec.x * force) - z = z + (vec.z * force) - end - end - - return({x,z}) -end -]]-- - local collision = function(self) pos = self.object:get_pos() --do collision detection from the base of the mob @@ -351,27 +305,6 @@ end - - - - - - - - - ------------------------------------------------------------------------------------------------------------------------------------- - - - - - - - - - - - -- move mob in facing direction local set_velocity = function(self, v) local c_x, c_y = 0, 0 From 6fff719322ee250fc7c074d2362edbf0c4090406 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Mon, 12 Apr 2021 08:47:07 -0400 Subject: [PATCH 008/176] Localize minetest library --- mods/ENTITIES/mcl_mobs/api.lua | 315 ++++++++++++++++++--------------- 1 file changed, 171 insertions(+), 144 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index a59733e5d9..3b2ecfac21 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -4,6 +4,33 @@ -- lua locals +--localize minetest functions +local minetest_settings = minetest.settings +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_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_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_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_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 + -- localize math functions local math_pi = math.pi local math_sin = math.sin @@ -16,21 +43,21 @@ local math_random = math.random local math_floor = math.floor mobs = {} - +-- mob constants local MAX_MOB_NAME_LENGTH = 30 -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 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 MOB_CAP = {} +local MOB_CAP = {} MOB_CAP.hostile = 70 MOB_CAP.passive = 10 MOB_CAP.ambient = 15 -MOB_CAP.water = 15 +MOB_CAP.water = 15 -- Localize local S = minetest.get_translator("mcl_mobs") @@ -62,22 +89,22 @@ end -- Load 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 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 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 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) -- 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 +if minetest_settings:get_bool("only_peaceful_mobs", false) then minetest.register_on_joinplayer(function(player) minetest.chat_send_player(player:get_player_name(), S("Peaceful mode active! No monsters will spawn.")) @@ -95,13 +122,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") ~= 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 ----For Water Flowing: local enable_physics = function(object, luaentity, ignore_check) @@ -161,7 +188,7 @@ local mob_sound = function(self, soundname, is_opinion, fixed_pitch) -- randomize the pitch a bit pitch = pitch + math_random(-10, 10) * 0.005 end - minetest.sound_play(sound, { + minetest_sound_play(sound, { object = self.object, gain = 1.0, max_hear_distance = self.sounds.distance, @@ -229,7 +256,7 @@ local collision = function(self) collision_count = 0 - for _,object in ipairs(minetest.get_objects_inside_radius(pos, radius*1.25)) do + for _,object in ipairs(minetest_get_objects_inside_radius(pos, radius*1.25)) do if object ~= self.object and (object:is_player() or object:get_luaentity()._cmi_is_mob == true) 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 @@ -469,16 +496,16 @@ end local is_node_dangerous = function(self, nodename) local nn = nodename if self.lava_damage > 0 then - if minetest.get_item_group(nn, "lava") ~= 0 then + if minetest_get_item_group(nn, "lava") ~= 0 then return true end end if self.fire_damage > 0 then - if minetest.get_item_group(nn, "fire") ~= 0 then + if minetest_get_item_group(nn, "fire") ~= 0 then return true end end - if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].damage_per_second and minetest.registered_nodes[nn].damage_per_second > 0 then + if minetest_registered_nodes[nn] and minetest_registered_nodes[nn].damage_per_second and minetest_registered_nodes[nn].damage_per_second > 0 then return true end return false @@ -489,15 +516,15 @@ end local is_node_waterhazard = function(self, nodename) local nn = nodename if self.water_damage > 0 then - if minetest.get_item_group(nn, "water") ~= 0 then + if minetest_get_item_group(nn, "water") ~= 0 then return true end end - if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].drowning and minetest.registered_nodes[nn].drowning > 0 then + if minetest_registered_nodes[nn] and minetest_registered_nodes[nn].drowning and minetest_registered_nodes[nn].drowning > 0 then if self.breath_max ~= -1 then -- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case -- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous - if not self.breathes_in_water and minetest.get_item_group(nn, "water") ~= 0 then + if not self.breathes_in_water and minetest_get_item_group(nn, "water") ~= 0 then return true end end @@ -511,7 +538,7 @@ local line_of_sight = function(self, pos1, pos2, stepsize) stepsize = stepsize or 1 - local s, pos = minetest.line_of_sight(pos1, pos2, stepsize) + local s, pos = minetest_line_of_sight(pos1, pos2, stepsize) -- normal walking and flying mobs can see you through air if s == true then @@ -521,13 +548,13 @@ local line_of_sight = function(self, pos1, pos2, stepsize) -- New pos1 to be analyzed local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} - local r, pos = minetest.line_of_sight(npos1, pos2, stepsize) + local r, pos = minetest_line_of_sight(npos1, pos2, stepsize) -- Checks the return if r == true then return true end -- Nodename found - local nn = minetest.get_node(pos).name + local nn = minetest_get_node(pos).name -- Target Distance (td) to travel local td = vector.distance(pos1, pos2) @@ -537,8 +564,8 @@ local line_of_sight = function(self, pos1, pos2, stepsize) -- It continues to advance in the line of sight in search of a real -- obstruction which counts as 'normal' nodebox. - while minetest.registered_nodes[nn] - and minetest.registered_nodes[nn].walkable == false do + while minetest_registered_nodes[nn] + and minetest_registered_nodes[nn].walkable == false do -- Check if you can still move forward if td < ad + stepsize then @@ -563,12 +590,12 @@ local line_of_sight = function(self, pos1, pos2, stepsize) ad = ad + stepsize -- scan again - r, pos = minetest.line_of_sight(npos1, pos2, stepsize) + r, pos = minetest_line_of_sight(npos1, pos2, stepsize) if r == true then return true end -- New Nodename found - nn = minetest.get_node(pos).name + nn = minetest_get_node(pos).name end @@ -580,7 +607,7 @@ end local flight_check = function(self) local nod = self.standing_in - local def = minetest.registered_nodes[nod] + local def = minetest_registered_nodes[nod] if not def then return false end -- nil check @@ -597,7 +624,7 @@ local flight_check = function(self) if nod == checknode then return true elseif checknode == "__airlike" and def.walkable == false and - (def.liquidtype == "none" or minetest.get_item_group(nod, "fake_liquid") == 1) then + (def.liquidtype == "none" or minetest_get_item_group(nod, "fake_liquid") == 1) then return true end end @@ -623,7 +650,7 @@ local effect = function(pos, amount, texture, min_size, max_size, radius, gravit ym = -radius end - minetest.add_particlespawner({ + minetest_add_particlespawner({ amount = amount, time = 0.25, minpos = pos, @@ -682,7 +709,7 @@ mobs.death_effect = function(pos, yaw, collisionbox, rotate) max = vector.multiply(max, 0.5) end - minetest.add_particlespawner({ + minetest_add_particlespawner({ amount = 50, time = 0.001, minpos = vector.add(pos, min), @@ -698,7 +725,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, @@ -780,7 +807,7 @@ local item_drop = function(self, cooked, looting_level) -- cook items when true if cooked then - local output = minetest.get_craft_result({ + local output = minetest_get_craft_result({ method = "cooking", width = 1, items = {item}}) if output and output.item and not output.item:is_empty() then @@ -790,7 +817,7 @@ local item_drop = function(self, cooked, looting_level) -- add item if it exists for x = 1, num do - obj = minetest.add_item(pos, ItemStack(item .. " " .. 1)) + obj = minetest_add_item(pos, ItemStack(item .. " " .. 1)) end if obj and obj:get_luaentity() then @@ -836,7 +863,7 @@ local check_for_death = function(self, cause, cmi_cause) -- play damage sound if health was reduced and make mob flash red. if damaged then add_texture_mod(self, "^[colorize:red:130") - minetest.after(.2, function(self) + minetest_after(.2, function(self) if self and self.object then remove_texture_mod(self, "^[colorize:red:130") end @@ -879,7 +906,7 @@ local check_for_death = function(self, cause, cmi_cause) local looting = mcl_enchanting.get_enchantment(wielditem, "looting") 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 + 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)) end end @@ -972,7 +999,7 @@ local check_for_death = function(self, cause, cmi_cause) if length <= 0 then kill(self) else - minetest.after(length, kill, self) + minetest_after(length, kill, self) end return true @@ -1016,18 +1043,18 @@ local is_at_cliff_or_danger = function(self) local pos = self.object:get_pos() local ypos = pos.y + self.collisionbox[2] -- just above floor - local free_fall, blocker = minetest.line_of_sight( + local free_fall, blocker = minetest_line_of_sight( {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) if free_fall then return true else - local bnode = minetest.get_node(blocker) + local bnode = minetest_get_node(blocker) local danger = is_node_dangerous(self, bnode.name) if danger then return true else - local def = minetest.registered_nodes[bnode.name] + local def = minetest_registered_nodes[bnode.name] if def and def.walkable then return false end @@ -1051,13 +1078,13 @@ local is_at_water_danger = function(self) local pos = self.object:get_pos() local ypos = pos.y + self.collisionbox[2] -- just above floor - local free_fall, blocker = minetest.line_of_sight( + local free_fall, blocker = minetest_line_of_sight( {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, {x = pos.x + dir_x, y = ypos - 3, z = pos.z + dir_z}) if free_fall then return true else - local bnode = minetest.get_node(blocker) + local bnode = minetest_get_node(blocker) local waterdanger = is_node_waterhazard(self, bnode.name) if waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) then @@ -1065,7 +1092,7 @@ local is_at_water_danger = function(self) elseif waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) == false then return true else - local def = minetest.registered_nodes[bnode.name] + local def = minetest_registered_nodes[bnode.name] if def and def.walkable then return false end @@ -1081,13 +1108,13 @@ local node_ok = function(pos, fallback) fallback = fallback or mobs.fallback_node - local node = minetest.get_node_or_nil(pos) + local node = minetest_get_node_or_nil(pos) - if node and minetest.registered_nodes[node.name] then + if node and minetest_registered_nodes[node.name] then return node end - return minetest.registered_nodes[fallback] + return minetest_registered_nodes[fallback] end @@ -1135,7 +1162,7 @@ local do_env_damage = function(self) -- Use get_node_light for Minetest version 5.3 where get_natural_light -- does not exist yet. - local get_light = minetest.get_natural_light or minetest.get_node_light + local get_light = minetest_get_natural_light or minetest_get_node_light local sunlight = get_light(pos, self.time_of_day) -- bright light harms mob @@ -1174,7 +1201,7 @@ local do_env_damage = function(self) self.object:set_velocity({x = 0, y = 0, z = 0}) end - local nodef = minetest.registered_nodes[self.standing_in] + local nodef = minetest_registered_nodes[self.standing_in] -- rain if self.rain_damage > 0 and mod_weather then @@ -1256,7 +1283,7 @@ local do_env_damage = function(self) if self.breath_max ~= -1 then local drowning = false if self.breathes_in_water then - if minetest.get_item_group(self.standing_in, "water") == 0 then + if minetest_get_item_group(self.standing_in, "water") == 0 then drowning = true end elseif nodef.drowning > 0 then @@ -1348,7 +1375,7 @@ local do_jump = function(self) local nod = node_ok(pos) - if minetest.registered_nodes[nod.name].walkable == false then + if minetest_registered_nodes[nod.name].walkable == false then return false end @@ -1372,7 +1399,7 @@ local do_jump = function(self) }, "air") -- we don't attempt to jump if there's a stack of blocks blocking - if minetest.registered_nodes[nodTop.name].walkable == true then + if minetest_registered_nodes[nodTop.name].walkable == true then return false end @@ -1382,11 +1409,11 @@ local do_jump = function(self) end if self.walk_chance == 0 - or minetest.registered_items[nod.name].walkable then + or minetest_registered_items[nod.name].walkable then - if minetest.get_item_group(nod.name, "fence") == 0 - and minetest.get_item_group(nod.name, "fence_gate") == 0 - and minetest.get_item_group(nod.name, "wall") == 0 then + if minetest_get_item_group(nod.name, "fence") == 0 + and minetest_get_item_group(nod.name, "fence_gate") == 0 + and minetest_get_item_group(nod.name, "wall") == 0 then local v = self.object:get_velocity() @@ -1397,7 +1424,7 @@ local do_jump = function(self) self.object:set_velocity(v) -- when in air move forward - minetest.after(0.3, function(self, v) + minetest_after(0.3, function(self, v) if (not self.object) or (not self.object:get_luaentity()) or (self.state == "die") then return end @@ -1444,7 +1471,7 @@ local entity_physics = function(pos, radius) radius = radius * 2 - local objs = minetest.get_objects_inside_radius(pos, radius) + local objs = minetest_get_objects_inside_radius(pos, radius) local obj_pos, dist for n = 1, #objs do @@ -1555,7 +1582,7 @@ local breed = function(self) effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) - local objs = minetest.get_objects_inside_radius(pos, 3) + local objs = minetest_get_objects_inside_radius(pos, 3) local num = 0 local ent = nil @@ -1599,7 +1626,7 @@ local breed = function(self) ent.hornytimer = BREED_TIME + 1 -- spawn baby - minetest.after(5, function(parent1, parent2, pos) + minetest_after(5, function(parent1, parent2, pos) if not parent1.object:get_luaentity() then return end @@ -1678,7 +1705,7 @@ local replace = function(self, pos) pos.y = pos.y + y_offset - local node = minetest.get_node(pos) + local node = minetest_get_node(pos) if node.name == what then local oldnode = {name = what, param2 = node.param2} @@ -1692,7 +1719,7 @@ local replace = function(self, pos) if on_replace_return ~= false then if mobs_griefing then - minetest.set_node(pos, newnode) + minetest_set_node(pos, newnode) end end @@ -1736,7 +1763,7 @@ local smart_mobs = function(self, s, p, dist, dtime) self.path.lastpos = {x = s.x, y = s.y, z = s.z} local use_pathfind = false - local has_lineofsight = minetest.line_of_sight( + local has_lineofsight = minetest_line_of_sight( {x = s.x, y = (s.y) + .5, z = s.z}, {x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2) @@ -1753,7 +1780,7 @@ local smart_mobs = function(self, s, p, dist, dtime) los_switcher = true use_pathfind = false - minetest.after(1, function(self) + minetest_after(1, function(self) if not self.object:get_luaentity() then return end @@ -1767,7 +1794,7 @@ local smart_mobs = function(self, s, p, dist, dtime) use_pathfind = true self.path.stuck_timer = 0 - minetest.after(1, function(self) + minetest_after(1, function(self) if not self.object:get_luaentity() then return end @@ -1780,7 +1807,7 @@ local smart_mobs = function(self, s, p, dist, dtime) use_pathfind = true self.path.stuck_timer = 0 - minetest.after(1, function(self) + minetest_after(1, function(self) if not self.object:get_luaentity() then return end @@ -1811,7 +1838,7 @@ local smart_mobs = function(self, s, p, dist, dtime) s.x = math_floor(s.x + 0.5) s.z = math_floor(s.z + 0.5) - local ssight, sground = minetest.line_of_sight(s, { + local ssight, sground = minetest_line_of_sight(s, { x = s.x, y = s.y - 4, z = s.z}, 1) -- determine node above ground @@ -1833,7 +1860,7 @@ local smart_mobs = function(self, s, p, dist, dtime) elseif self.stepheight > 0.5 then jumpheight = 1 end - self.path.way = minetest.find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch") + self.path.way = minetest_find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch") self.state = "" do_attack(self, self.attack) @@ -1850,13 +1877,13 @@ local smart_mobs = function(self, s, p, dist, dtime) if s.y < p1.y then -- build upwards - if not minetest.is_protected(s, "") then + if not minetest_is_protected(s, "") then - local ndef1 = minetest.registered_nodes[self.standing_in] + local ndef1 = minetest_registered_nodes[self.standing_in] if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then - minetest.set_node(s, {name = mobs.fallback_node}) + minetest_set_node(s, {name = mobs.fallback_node}) end end @@ -1866,10 +1893,10 @@ local smart_mobs = function(self, s, p, dist, dtime) s.y = s.y + sheight -- remove one block above to make room to jump - if not minetest.is_protected(s, "") then + if not minetest_is_protected(s, "") then local node1 = node_ok(s, "air").name - local ndef1 = minetest.registered_nodes[node1] + local ndef1 = minetest_registered_nodes[node1] if node1 ~= "air" and node1 ~= "ignore" @@ -1878,8 +1905,8 @@ local smart_mobs = function(self, s, p, dist, dtime) and not ndef1.groups.unbreakable and not ndef1.groups.liquid then - minetest.set_node(s, {name = "air"}) - minetest.add_item(s, ItemStack(node1)) + minetest_set_node(s, {name = "air"}) + minetest_add_item(s, ItemStack(node1)) end end @@ -1896,10 +1923,10 @@ local smart_mobs = function(self, s, p, dist, dtime) z = s.z + math_sin(yaw1) } - if not minetest.is_protected(p1, "") then + if not minetest_is_protected(p1, "") then local node1 = node_ok(p1, "air").name - local ndef1 = minetest.registered_nodes[node1] + local ndef1 = minetest_registered_nodes[node1] if node1 ~= "air" and node1 ~= "ignore" @@ -1908,13 +1935,13 @@ local smart_mobs = function(self, s, p, dist, dtime) and not ndef1.groups.unbreakable and not ndef1.groups.liquid then - minetest.add_item(p1, ItemStack(node1)) - minetest.set_node(p1, {name = "air"}) + minetest_add_item(p1, ItemStack(node1)) + minetest_set_node(p1, {name = "air"}) end p1.y = p1.y + 1 node1 = node_ok(p1, "air").name - ndef1 = minetest.registered_nodes[node1] + ndef1 = minetest_registered_nodes[node1] if node1 ~= "air" and node1 ~= "ignore" @@ -1923,8 +1950,8 @@ local smart_mobs = function(self, s, p, dist, dtime) and not ndef1.groups.unbreakable and not ndef1.groups.liquid then - minetest.add_item(p1, ItemStack(node1)) - minetest.set_node(p1, {name = "air"}) + minetest_add_item(p1, ItemStack(node1)) + minetest_set_node(p1, {name = "air"}) end end @@ -1973,7 +2000,7 @@ local monster_attack = function(self) if self.type ~= "monster" or not damage_enabled - or minetest.is_creative_enabled("") + or minetest_is_creative_enabled("") or self.passive or self.state == "attack" or day_docile(self) then @@ -1985,7 +2012,7 @@ local monster_attack = function(self) local player, obj, min_player local type, name = "", "" local min_dist = self.view_range + 1 - local objs = minetest.get_objects_inside_radius(s, self.view_range) + local objs = minetest_get_objects_inside_radius(s, self.view_range) for n = 1, #objs do @@ -2051,7 +2078,7 @@ local npc_attack = function(self) local p, sp, obj, min_player local s = self.object:get_pos() local min_dist = self.view_range + 1 - local objs = minetest.get_objects_inside_radius(s, self.view_range) + local objs = minetest_get_objects_inside_radius(s, self.view_range) for n = 1, #objs do @@ -2114,7 +2141,7 @@ local runaway_from = function(self) local player, obj, min_player local type, name = "", "" local min_dist = self.view_range + 1 - local objs = minetest.get_objects_inside_radius(s, self.view_range) + local objs = minetest_get_objects_inside_radius(s, self.view_range) for n = 1, #objs do @@ -2296,7 +2323,7 @@ local follow_flop = function(self) self.state = "flop" self.object:set_acceleration({x = 0, y = DEFAULT_FALL_SPEED, z = 0}) - local sdef = minetest.registered_nodes[self.standing_on] + local sdef = minetest_registered_nodes[self.standing_on] -- Flop on ground if sdef and sdef.walkable then mob_sound(self, "flop") @@ -2359,7 +2386,7 @@ local do_states = function(self, dtime) local lp = nil local s = self.object:get_pos() - local objs = minetest.get_objects_inside_radius(s, 3) + local objs = minetest_get_objects_inside_radius(s, 3) for n = 1, #objs do @@ -2415,19 +2442,19 @@ local do_states = function(self, dtime) and self.lava_damage > 0) or self.breath_max ~= -1 then - lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"}) + lp = minetest_find_node_near(s, 1, {"group:water", "group:lava"}) elseif self.water_damage > 0 then - lp = minetest.find_node_near(s, 1, {"group:water"}) + lp = minetest_find_node_near(s, 1, {"group:water"}) elseif self.lava_damage > 0 then - lp = minetest.find_node_near(s, 1, {"group:lava"}) + lp = minetest_find_node_near(s, 1, {"group:lava"}) elseif self.fire_damage > 0 then - lp = minetest.find_node_near(s, 1, {"group:fire"}) + lp = minetest_find_node_near(s, 1, {"group:fire"}) end @@ -2441,7 +2468,7 @@ local do_states = function(self, dtime) -- If mob in or on dangerous block, look for land if is_in_danger then -- Better way to find shore - copied from upstream - lp = minetest.find_nodes_in_area_under_air( + lp = minetest_find_nodes_in_area_under_air( {x = s.x - 5, y = s.y - 0.5, z = s.z - 5}, {x = s.x + 5, y = s.y + 1, z = s.z + 5}, {"group:solid"}) @@ -2637,10 +2664,10 @@ local do_states = function(self, dtime) local pos = self.object:get_pos() if mod_explosions then - if mobs_griefing and not minetest.is_protected(pos, "") then + if mobs_griefing and not minetest_is_protected(pos, "") then mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object) else - minetest.sound_play(self.sounds.explode, { + minetest_sound_play(self.sounds.explode, { pos = pos, gain = 1.0, max_hear_distance = self.sounds.distance or 32 @@ -2860,7 +2887,7 @@ local do_states = function(self, dtime) if self.shoot_interval and self.timer > self.shoot_interval - and not minetest.raycast(p, self.attack:get_pos(), false, false):next() + and not minetest_raycast(p, self.attack:get_pos(), false, false):next() and math_random(1, 100) <= 60 then self.timer = 0 @@ -2870,16 +2897,16 @@ local do_states = function(self, dtime) mob_sound(self, "shoot_attack") -- Shoot arrow - if minetest.registered_entities[self.arrow] then + if minetest_registered_entities[self.arrow] then local arrow, ent local v = 1 if not self.shoot_arrow then self.firing = true - minetest.after(1, function() + minetest_after(1, function() self.firing = false end) - arrow = minetest.add_entity(p, self.arrow) + arrow = minetest_add_entity(p, self.arrow) ent = arrow:get_luaentity() if ent.velocity then v = ent.velocity @@ -2946,7 +2973,7 @@ local falling = function(self, pos) self.object:set_acceleration({x = 0, y = 0, z = 0}) end - if minetest.registered_nodes[node_ok(pos).name].groups.lava then + if minetest_registered_nodes[node_ok(pos).name].groups.lava then if self.floats_on_lava == 1 then @@ -2959,7 +2986,7 @@ local falling = function(self, pos) end -- in water then float up - if minetest.registered_nodes[node_ok(pos).name].groups.water then + if minetest_registered_nodes[node_ok(pos).name].groups.water then if self.floats == 1 then @@ -2979,7 +3006,7 @@ local falling = function(self, pos) if d > 5 then - local add = minetest.get_item_group(self.standing_on, "fall_damage_add_percent") + local add = minetest_get_item_group(self.standing_on, "fall_damage_add_percent") local damage = d - 5 if add ~= 0 then damage = damage + damage * (add/100) @@ -3032,12 +3059,12 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) if is_player then -- is mob protected? - if self.protected and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then + if self.protected and minetest_is_protected(self.object:get_pos(), hitter:get_player_name()) then return end -- set/update 'drop xp' timestamp if hitted by player - self.xp_timestamp = minetest.get_us_time() + self.xp_timestamp = minetest_get_us_time() end @@ -3115,11 +3142,11 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- add weapon wear manually -- Required because we have custom health handling ("health" property) - if minetest.is_creative_enabled("") ~= true + if minetest_is_creative_enabled("") ~= true and tool_capabilities then if tool_capabilities.punch_attack_uses then -- Without this delay, the wear does not work. Quite hacky ... - minetest.after(0, function(name) + minetest_after(0, function(name) local player = minetest.get_player_by_name(name) if not player then return end local weapon = hitter:get_wielded_item(player) @@ -3143,12 +3170,12 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) local s = math_random(0, #weapon:get_definition().sounds) - minetest.sound_play(weapon:get_definition().sounds[s], { + minetest_sound_play(weapon:get_definition().sounds[s], { object = self.object, --hitter, max_hear_distance = 8 }, true) else - minetest.sound_play("default_punch", { + minetest_sound_play("default_punch", { object = self.object, max_hear_distance = 5 }, true) @@ -3251,7 +3278,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end -- alert others to the attack - local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) + local objs = minetest_get_objects_inside_radius(hitter:get_pos(), self.view_range) local obj = nil for n = 1, #objs do @@ -3343,7 +3370,7 @@ local mob_activate = function(self, staticdata, def, dtime) -- remove monsters in peaceful mode if self.type == "monster" - and minetest.settings:get_bool("only_peaceful_mobs", false) then + and minetest_settings:get_bool("only_peaceful_mobs", false) then mcl_burning.extinguish(self.object) self.object:remove() @@ -3680,10 +3707,10 @@ local mob_step = function(self, dtime) -- Add water flowing for mobs from mcl_item_entity local p, node, nn, def p = self.object:get_pos() - node = minetest.get_node_or_nil(p) + node = minetest_get_node_or_nil(p) if node then nn = node.name - def = minetest.registered_nodes[nn] + def = minetest_registered_nodes[nn] end -- Move item around on flowing liquids @@ -3990,7 +4017,7 @@ minetest.register_entity(name, { }) -if minetest.get_modpath("doc_identifier") ~= nil then +if minetest_get_modpath("doc_identifier") ~= nil then doc.sub.identifier.register_object(name, "basics", "mobs") end @@ -4054,7 +4081,7 @@ function mobs:register_arrow(name, def) local node = node_ok(pos).name - if minetest.registered_nodes[node].walkable then + if minetest_registered_nodes[node].walkable then self.hit_node(self, pos, node) @@ -4064,7 +4091,7 @@ function mobs:register_arrow(name, def) self.lastpos = (self.lastpos or pos) - minetest.add_item(self.lastpos, self.object:get_luaentity().name) + minetest_add_item(self.lastpos, self.object:get_luaentity().name) end self.object:remove(); @@ -4075,7 +4102,7 @@ function mobs:register_arrow(name, def) if self.hit_player or self.hit_mob or self.hit_object then - for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do + for _,player in pairs(minetest_get_objects_inside_radius(pos, 1.5)) do if self.hit_player and player:is_player() then @@ -4117,7 +4144,7 @@ end -- no damage to nodes explosion function mobs:safe_boom(self, pos, strength) - minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", { + minetest_sound_play(self.sounds and self.sounds.explode or "tnt_explode", { pos = pos, gain = 1.0, max_hear_distance = self.sounds and self.sounds.distance or 32 @@ -4132,7 +4159,7 @@ end function mobs:boom(self, pos, strength, fire) self.object:remove() if mod_explosions then - if mobs_griefing and not minetest.is_protected(pos, "") then + if mobs_griefing and not minetest_is_protected(pos, "") then mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object) else mobs:safe_boom(self, pos, strength) @@ -4179,20 +4206,20 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) local pos = pointed_thing.above -- am I clicking on something with existing on_rightclick function? - local under = minetest.get_node(pointed_thing.under) - local def = minetest.registered_nodes[under.name] + local under = minetest_get_node(pointed_thing.under) + local def = minetest_registered_nodes[under.name] if def and def.on_rightclick then return def.on_rightclick(pointed_thing.under, under, placer, itemstack) end 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 @@ -4207,19 +4234,19 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) return itemstack end - if not minetest.registered_entities[mob] then + if not minetest_registered_entities[mob] then return itemstack end - if minetest.settings:get_bool("only_peaceful_mobs", false) - and minetest.registered_entities[mob].type == "monster" then + if minetest_settings:get_bool("only_peaceful_mobs", false) + and minetest_registered_entities[mob].type == "monster" then minetest.chat_send_player(name, S("Only peaceful mobs allowed!")) return itemstack end pos.y = pos.y - 0.5 - local mob = minetest.add_entity(pos, mob) + local mob = minetest_add_entity(pos, mob) minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) local ent = mob:get_luaentity() @@ -4343,7 +4370,7 @@ end -- Spawn a child function mobs:spawn_child(pos, mob_type) - local child = minetest.add_entity(pos, mob_type) + local child = minetest_add_entity(pos, mob_type) if not child then return end @@ -4401,8 +4428,8 @@ function mobs:alias_mob(old_name, new_name) on_step = function(self) - if minetest.registered_entities[new_name] then - minetest.add_entity(self.object:get_pos(), new_name) + if minetest_registered_entities[new_name] then + minetest_add_entity(self.object:get_pos(), new_name) end self.object:remove() @@ -4418,7 +4445,7 @@ minetest.register_globalstep(function(dtime) if timer < 1 then return end for _, player in pairs(minetest.get_connected_players()) do local pos = player:get_pos() - for _, obj in pairs(minetest.get_objects_inside_radius(pos, 47)) do + for _, obj in pairs(minetest_get_objects_inside_radius(pos, 47)) do local lua = obj:get_luaentity() if lua and lua._cmi_is_mob then lua.lifetimer = math.max(20, lua.lifetimer) From 3fc0184182f70be0c2fd9b3be1c5d78fa7f00503 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 13 Apr 2021 07:39:57 -0400 Subject: [PATCH 009/176] Disable entire mob ai to work on vanilla walking --- mods/ENTITIES/mcl_mobs/api.lua | 217 +++++++++++++++++---------------- 1 file changed, 115 insertions(+), 102 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 3b2ecfac21..1b234dae28 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -42,6 +42,9 @@ local math_atan = math.atan local math_random = math.random local math_floor = math.floor +-- localize vector functions +local vector_new = vector.new + mobs = {} -- mob constants local MAX_MOB_NAME_LENGTH = 30 @@ -3538,43 +3541,48 @@ local mob_step = function(self, dtime) return false end + if self.state == "die" then + print("need custom die stop moving thing") + return + end + -- can mob be pushed, if so calculate direction -- do this first to prevent issues - -- you can push mobs when they're in the dead state if self.pushable then collision(self) end - if not self.fire_resistant then - mcl_burning.tick(self.object, dtime) - end - if use_cmi then - cmi.notify_step(self.object, dtime) - end + + + --if not self.fire_resistant then + -- mcl_burning.tick(self.object, dtime) + --end + + --if use_cmi then + --cmi.notify_step(self.object, dtime) + --end local pos = self.object:get_pos() local yaw = 0 - if mobs_debug then - update_tag(self) - end + --if mobs_debug then + --update_tag(self) + --end - if self.state == "die" then - return - end - if self.jump_sound_cooloff > 0 then - self.jump_sound_cooloff = self.jump_sound_cooloff - dtime - end - if self.opinion_sound_cooloff > 0 then - self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime - end + --if self.jump_sound_cooloff > 0 then + -- self.jump_sound_cooloff = self.jump_sound_cooloff - dtime + --end - if falling(self, pos) then + --if self.opinion_sound_cooloff > 0 then + -- self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime + --end + + --if falling(self, pos) then -- Return if mob died after falling - return - end + -- return + --end -- smooth rotation by ThomasMonroe314 @@ -3621,24 +3629,24 @@ local mob_step = function(self, dtime) -- end rotation -- run custom function (defined in mob lua file) - if self.do_custom then + --if self.do_custom then -- when false skip going any further - if self.do_custom(self, dtime) == false then - return - end - end + --if self.do_custom(self, dtime) == false then + -- return + --end + --end -- knockback timer - if self.pause_timer > 0 then + --if self.pause_timer > 0 then - self.pause_timer = self.pause_timer - dtime + -- self.pause_timer = self.pause_timer - dtime - return - end + -- return + --end -- attack timer - self.timer = self.timer + dtime + --self.timer = self.timer + dtime --[[ if self.state ~= "attack" then @@ -3653,99 +3661,102 @@ local mob_step = function(self, dtime) ]]-- -- never go over 100 - if self.timer > 100 then - self.timer = 1 - end + --if self.timer > 100 then + -- self.timer = 1 + --end -- mob plays random sound at times - if math_random(1, 70) == 1 then - mob_sound(self, "random", true) - end + --if math_random(1, 70) == 1 then + -- mob_sound(self, "random", true) + --end -- environmental damage timer (every 1 second) - self.env_damage_timer = self.env_damage_timer + dtime - - if (self.state == "attack" and self.env_damage_timer > 1) - or self.state ~= "attack" then - - self.env_damage_timer = 0 - - -- check for environmental damage (water, fire, lava etc.) - if do_env_damage(self) then - return - end + --self.env_damage_timer = self.env_damage_timer + dtime + --if (self.state == "attack" and self.env_damage_timer > 1) + --or self.state ~= "attack" then + -- + -- self.env_damage_timer = 0 + -- + -- -- check for environmental damage (water, fire, lava etc.) + -- if do_env_damage(self) then + -- return + -- end + -- -- node replace check (cow eats grass etc.) - replace(self, pos) - end + -- replace(self, pos) + --end - monster_attack(self) + --monster_attack(self) - npc_attack(self) + --npc_attack(self) - breed(self) + --breed(self) - if do_states(self, dtime) then - return - end + --if do_states(self, dtime) then + -- return + --end - do_jump(self) + --do_jump(self) - runaway_from(self) + --runaway_from(self) - if is_at_water_danger(self) and self.state ~= "attack" 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 = set_yaw(self, yaw, 8) - end - end + + --if is_at_water_danger(self) and self.state ~= "attack" 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 = set_yaw(self, yaw, 8) + -- end + --end -- Add water flowing for mobs from mcl_item_entity - local p, node, nn, def - p = self.object:get_pos() - node = minetest_get_node_or_nil(p) - if node then - nn = node.name - def = minetest_registered_nodes[nn] - end + --[[ + local p, node, nn, def + p = self.object:get_pos() + node = minetest_get_node_or_nil(p) + if node then + nn = node.name + def = minetest_registered_nodes[nn] + end - -- Move item around on flowing liquids - if def and def.liquidtype == "flowing" then - - --[[ Get flowing direction (function call from flowlib), if there's a liquid. - NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. - Luckily, this is exactly what we need if we only care about water, which has this flowing distance. ]] - local vec = flowlib.quick_flow(p, node) - -- Just to make sure we don't manipulate the speed for no reason - if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then - -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" - local f = 1.39 - -- Set new item moving speed into the direciton of the liquid - local newv = vector.multiply(vec, f) - self.object:set_acceleration({x = 0, y = 0, z = 0}) - self.object:set_velocity({x = newv.x, y = -0.22, z = newv.z}) + -- Move item around on flowing liquids + if def and def.liquidtype == "flowing" then + + -- Get flowing direction (function call from flowlib), if there's a liquid. + NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. + Luckily, this is exactly what we need if we only care about water, which has this flowing distance. + local vec = flowlib.quick_flow(p, node) + -- Just to make sure we don't manipulate the speed for no reason + if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then + -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" + local f = 1.39 + -- Set new item moving speed into the direciton of the liquid + local newv = vector.multiply(vec, f) + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = newv.x, y = -0.22, z = newv.z}) - self.physical_state = true - self._flowing = true - self.object:set_properties({ - physical = true - }) - return - end - elseif self._flowing == true then - -- Disable flowing physics if not on/in flowing liquid - self._flowing = false - enable_physics(self.object, self, true) + self.physical_state = true + self._flowing = true + self.object:set_properties({ + physical = true + }) return end + elseif self._flowing == true then + -- Disable flowing physics if not on/in flowing liquid + self._flowing = false + enable_physics(self.object, self, true) + return + end --Mob following code. follow_flop(self) + if is_at_cliff_or_danger(self) then set_velocity(self, 0) self.state = "stand" @@ -3774,6 +3785,7 @@ local mob_step = function(self, dtime) end end end + ]]-- end @@ -4005,7 +4017,8 @@ minetest.register_entity(name, { --default built in engine collision detection self.object:set_properties({ collide_with_objects = false, - }) + }) + self.object:set_acceleration(vector_new(0,-9.81, 0)) return mob_activate(self, staticdata, def, dtime) end, From 02515f0778bbe9cd962acc514b084c9dedf55074 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 13 Apr 2021 08:07:32 -0400 Subject: [PATCH 010/176] Move a large chunk of code to backup_code_api.lua --- mods/ENTITIES/mcl_mobs/api.lua | 1558 +------------------- mods/ENTITIES/mcl_mobs/backup_code_api.lua | 1466 ++++++++++++++++++ 2 files changed, 1530 insertions(+), 1494 deletions(-) create mode 100644 mods/ENTITIES/mcl_mobs/backup_code_api.lua diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 1b234dae28..3619ca3628 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1,6 +1,6 @@ -- API for Mobs Redo: MineClone 2 Delux 2.0 DRM Free Early Access Super Extreme Edition --- current state of things: "why are these not in the same table as those?", and, "why are these not localized?" +-- current state of things: Why? -- lua locals @@ -62,6 +62,11 @@ MOB_CAP.passive = 10 MOB_CAP.ambient = 15 MOB_CAP.water = 15 + +-- random locals I found +local los_switcher = false +local height_switcher = false + -- Localize local S = minetest.get_translator("mcl_mobs") @@ -133,30 +138,6 @@ 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 -----For Water Flowing: -local enable_physics = function(object, luaentity, ignore_check) - if luaentity.physical_state == false or ignore_check == true then - luaentity.physical_state = true - object:set_properties({ - physical = true - }) - object:set_velocity({x=0,y=0,z=0}) - object:set_acceleration({x=0,y=-9.81,z=0}) - end -end - -local disable_physics = function(object, luaentity, ignore_check, reset_movement) - if luaentity.physical_state == true or ignore_check == true then - luaentity.physical_state = false - object:set_properties({ - physical = false - }) - if reset_movement ~= false then - object:set_velocity({x=0,y=0,z=0}) - object:set_acceleration({x=0,y=0,z=0}) - end - end -end -- play sound @@ -424,36 +405,6 @@ function mobs:yaw(self, yaw, delay, dtime) set_yaw(self, yaw, delay, dtime) end -local add_texture_mod = function(self, mod) - local full_mod = "" - local already_added = false - for i=1, #self.texture_mods do - if mod == self.texture_mods[i] then - already_added = true - end - full_mod = full_mod .. self.texture_mods[i] - end - if not already_added then - full_mod = full_mod .. mod - table.insert(self.texture_mods, mod) - end - self.object:set_texture_mod(full_mod) -end -local remove_texture_mod = function(self, mod) - local full_mod = "" - local remove = {} - for i=1, #self.texture_mods do - if self.texture_mods[i] ~= mod then - full_mod = full_mod .. self.texture_mods[i] - else - table.insert(remove, i) - end - end - for i=#remove, 1 do - table.remove(self.texture_mods, remove[i]) - end - self.object:set_texture_mod(full_mod) -end -- set defined animation local set_animation = function(self, anim, fixed_frame) @@ -495,206 +446,6 @@ function mobs:set_animation(self, anim) set_animation(self, anim) end --- Returns true is node can deal damage to self -local is_node_dangerous = function(self, nodename) - local nn = nodename - if self.lava_damage > 0 then - if minetest_get_item_group(nn, "lava") ~= 0 then - return true - end - end - if self.fire_damage > 0 then - if minetest_get_item_group(nn, "fire") ~= 0 then - return true - end - end - if minetest_registered_nodes[nn] and minetest_registered_nodes[nn].damage_per_second and minetest_registered_nodes[nn].damage_per_second > 0 then - return true - end - return false -end - - --- Returns true if node is a water hazard -local is_node_waterhazard = function(self, nodename) - local nn = nodename - if self.water_damage > 0 then - if minetest_get_item_group(nn, "water") ~= 0 then - return true - end - end - if minetest_registered_nodes[nn] and minetest_registered_nodes[nn].drowning and minetest_registered_nodes[nn].drowning > 0 then - if self.breath_max ~= -1 then - -- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case - -- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous - if not self.breathes_in_water and minetest_get_item_group(nn, "water") ~= 0 then - return true - end - end - end - return false -end - - --- check line of sight (BrunoMine) -local line_of_sight = function(self, pos1, pos2, stepsize) - - stepsize = stepsize or 1 - - local s, pos = minetest_line_of_sight(pos1, pos2, stepsize) - - -- normal walking and flying mobs can see you through air - if s == true then - return true - end - - -- New pos1 to be analyzed - local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} - - local r, pos = minetest_line_of_sight(npos1, pos2, stepsize) - - -- Checks the return - if r == true then return true end - - -- Nodename found - local nn = minetest_get_node(pos).name - - -- Target Distance (td) to travel - local td = vector.distance(pos1, pos2) - - -- Actual Distance (ad) traveled - local ad = 0 - - -- It continues to advance in the line of sight in search of a real - -- obstruction which counts as 'normal' nodebox. - while minetest_registered_nodes[nn] - and minetest_registered_nodes[nn].walkable == false do - - -- Check if you can still move forward - if td < ad + stepsize then - return true -- Reached the target - end - - -- Moves the analyzed pos - local d = vector.distance(pos1, pos2) - - npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x - npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y - npos1.z = ((pos2.z - pos1.z) / d * stepsize) + pos1.z - - -- NaN checks - if d == 0 - or npos1.x ~= npos1.x - or npos1.y ~= npos1.y - or npos1.z ~= npos1.z then - return false - end - - ad = ad + stepsize - - -- scan again - r, pos = minetest_line_of_sight(npos1, pos2, stepsize) - - if r == true then return true end - - -- New Nodename found - nn = minetest_get_node(pos).name - - end - - return false -end - - --- are we flying in what we are suppose to? (taikedz) -local flight_check = function(self) - - local nod = self.standing_in - local def = minetest_registered_nodes[nod] - - if not def then return false end -- nil check - - local fly_in - if type(self.fly_in) == "string" then - fly_in = { self.fly_in } - elseif type(self.fly_in) == "table" then - fly_in = self.fly_in - else - return false - end - - for _,checknode in pairs(fly_in) do - if nod == checknode then - return true - elseif checknode == "__airlike" and def.walkable == false and - (def.liquidtype == "none" or minetest_get_item_group(nod, "fake_liquid") == 1) then - return true - end - end - - return false -end - - --- custom particle effects -local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down) - - radius = radius or 2 - min_size = min_size or 0.5 - max_size = max_size or 1 - gravity = gravity or -10 - glow = glow or 0 - go_down = go_down or false - - local ym - if go_down then - ym = 0 - else - ym = -radius - end - - minetest_add_particlespawner({ - amount = amount, - time = 0.25, - minpos = pos, - maxpos = pos, - minvel = {x = -radius, y = ym, z = -radius}, - maxvel = {x = radius, y = radius, z = radius}, - minacc = {x = 0, y = gravity, z = 0}, - maxacc = {x = 0, y = gravity, z = 0}, - minexptime = 0.1, - maxexptime = 1, - minsize = min_size, - maxsize = max_size, - texture = texture, - glow = glow, - }) -end - -local damage_effect = function(self, damage) - -- damage particles - if (not disable_blood) and damage > 0 then - - local amount_large = math_floor(damage / 2) - local amount_small = damage % 2 - - local pos = self.object:get_pos() - - pos.y = pos.y + (self.collisionbox[5] - self.collisionbox[2]) * .5 - - local texture = "mobs_blood.png" - -- full heart damage (one particle for each 2 HP damage) - if amount_large > 0 then - effect(pos, amount_large, texture, 2, 2, 1.75, 0, nil, true) - end - -- half heart damage (one additional particle if damage is an odd number) - if amount_small > 0 then - -- TODO: Use "half heart" - effect(pos, amount_small, texture, 1, 1, 1.75, 0, nil, true) - end - end -end - mobs.death_effect = function(pos, yaw, collisionbox, rotate) local min, max if collisionbox then @@ -735,279 +486,6 @@ mobs.death_effect = function(pos, yaw, collisionbox, rotate) }, true) end -local update_tag = function(self) - local tag - if mobs_debug then - tag = "nametag = '"..tostring(self.nametag).."'\n".. - "state = '"..tostring(self.state).."'\n".. - "order = '"..tostring(self.order).."'\n".. - "attack = "..tostring(self.attack).."\n".. - "health = "..tostring(self.health).."\n".. - "breath = "..tostring(self.breath).."\n".. - "gotten = "..tostring(self.gotten).."\n".. - "tamed = "..tostring(self.tamed).."\n".. - "horny = "..tostring(self.horny).."\n".. - "hornytimer = "..tostring(self.hornytimer).."\n".. - "runaway_timer = "..tostring(self.runaway_timer).."\n".. - "following = "..tostring(self.following) - else - tag = self.nametag - end - self.object:set_properties({ - nametag = tag, - }) - - update_roll(self) -end - --- drop items -local item_drop = function(self, cooked, looting_level) - - -- no drops if disabled by setting - if not mobs_drop_items then return end - - looting_level = looting_level or 0 - - -- no drops for child mobs (except monster) - if (self.child and self.type ~= "monster") then - return - end - - local obj, item, num - local pos = self.object:get_pos() - - self.drops = self.drops or {} -- nil check - - for n = 1, #self.drops do - local dropdef = self.drops[n] - local chance = 1 / dropdef.chance - local looting_type = dropdef.looting - - if looting_level > 0 then - local chance_function = dropdef.looting_chance_function - if chance_function then - chance = chance_function(looting_level) - elseif looting_type == "rare" then - chance = chance + (dropdef.looting_factor or 0.01) * looting_level - end - end - - local num = 0 - local do_common_looting = (looting_level > 0 and looting_type == "common") - if math_random() < chance then - num = math_random(dropdef.min or 1, dropdef.max or 1) - elseif not dropdef.looting_ignore_chance then - do_common_looting = false - end - - if do_common_looting then - num = num + math_floor(math_random(0, looting_level) + 0.5) - end - - if num > 0 then - item = dropdef.name - - -- cook items when true - if cooked then - - 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() - end - end - - -- add item if it exists - for x = 1, num do - obj = minetest_add_item(pos, ItemStack(item .. " " .. 1)) - end - - if obj and obj:get_luaentity() then - - obj:set_velocity({ - x = math_random(-10, 10) / 9, - y = 6, - z = math_random(-10, 10) / 9, - }) - elseif obj then - obj:remove() -- item does not exist - end - end - end - - self.drops = {} -end - - --- check if mob is dead or only hurt -local check_for_death = function(self, cause, cmi_cause) - - if self.state == "die" then - return true - end - - -- has health actually changed? - if self.health == self.old_health and self.health > 0 then - return false - end - - local damaged = self.health < self.old_health - self.old_health = self.health - - -- still got some health? - if self.health > 0 then - - -- make sure health isn't higher than max - if self.health > self.hp_max then - self.health = self.hp_max - end - - -- play damage sound if health was reduced and make mob flash red. - if damaged then - add_texture_mod(self, "^[colorize:red:130") - minetest_after(.2, function(self) - if self and self.object then - remove_texture_mod(self, "^[colorize:red:130") - end - end, self) - mob_sound(self, "damage") - end - - -- backup nametag so we can show health stats - if not self.nametag2 then - self.nametag2 = self.nametag or "" - end - - if show_health - and (cmi_cause and cmi_cause.type == "punch") then - - self.htimer = 2 - self.nametag = "♥ " .. self.health .. " / " .. self.hp_max - - update_tag(self) - end - - return false - end - - mob_sound(self, "death") - - local function death_handle(self) - -- dropped cooked item if mob died in fire or lava - if cause == "lava" or cause == "fire" then - item_drop(self, true, 0) - else - local wielditem = ItemStack() - if cause == "hit" then - local puncher = cmi_cause.puncher - if puncher then - wielditem = puncher:get_wielded_item() - end - end - local cooked = mcl_burning.is_burning(self.object) or mcl_enchanting.has_enchantment(wielditem, "fire_aspect") - local looting = mcl_enchanting.get_enchantment(wielditem, "looting") - 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)) - end - end - end - - -- execute custom death function - if self.on_die then - - local pos = self.object:get_pos() - local on_die_exit = self.on_die(self, pos, cmi_cause) - if on_die_exit ~= true then - death_handle(self) - end - - if use_cmi then - cmi.notify_die(self.object, cmi_cause) - end - - if on_die_exit == true then - self.state = "die" - mcl_burning.extinguish(self.object) - self.object:remove() - return true - end - end - - local collisionbox - if self.collisionbox then - collisionbox = table.copy(self.collisionbox) - end - - self.state = "die" - self.attack = nil - self.v_start = false - self.fall_speed = DEFAULT_FALL_SPEED - self.timer = 0 - self.blinktimer = 0 - remove_texture_mod(self, "^[colorize:#FF000040") - remove_texture_mod(self, "^[brighten") - self.passive = true - - self.object:set_properties({ - pointable = false, - collide_with_objects = false, - }) - - set_velocity(self, 0) - local acc = self.object:get_acceleration() - acc.x, acc.y, acc.z = 0, DEFAULT_FALL_SPEED, 0 - self.object:set_acceleration(acc) - - local length - -- default death function and die animation (if defined) - if self.instant_death then - length = 0 - elseif self.animation - and self.animation.die_start - and self.animation.die_end then - - local frames = self.animation.die_end - self.animation.die_start - local speed = self.animation.die_speed or 15 - length = max(frames / speed, 0) + DEATH_DELAY - set_animation(self, "die") - else - local rot = self.object:get_rotation() - rot.z = math_pi/2 - self.object:set_rotation(rot) - length = 1 + DEATH_DELAY - set_animation(self, "stand", true) - end - - - -- Remove body after a few seconds and drop stuff - local kill = function(self) - if not self.object:get_luaentity() then - return - end - if use_cmi then - cmi.notify_die(self.object, cmi_cause) - end - - death_handle(self) - local dpos = self.object:get_pos() - local cbox = self.collisionbox - local yaw = self.object:get_rotation().y - mcl_burning.extinguish(self.object) - self.object:remove() - mobs.death_effect(dpos, yaw, cbox, not self.instant_death) - end - if length <= 0 then - kill(self) - else - minetest_after(length, kill, self) - end - - return true -end - -- check if within physical map limits (-30911 to 30927) local within_limits, wmin, wmax = nil, -30913, 30928 @@ -1746,636 +1224,7 @@ local day_docile = function(self) end -local los_switcher = false -local height_switcher = false --- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 -local smart_mobs = function(self, s, p, dist, dtime) - - local s1 = self.path.lastpos - - local target_pos = self.attack:get_pos() - - -- is it becoming stuck? - if math_abs(s1.x - s.x) + math_abs(s1.z - s.z) < .5 then - self.path.stuck_timer = self.path.stuck_timer + dtime - else - self.path.stuck_timer = 0 - end - - self.path.lastpos = {x = s.x, y = s.y, z = s.z} - - local use_pathfind = false - local has_lineofsight = minetest_line_of_sight( - {x = s.x, y = (s.y) + .5, z = s.z}, - {x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2) - - -- im stuck, search for path - if not has_lineofsight then - - if los_switcher == true then - use_pathfind = true - los_switcher = false - end -- cannot see target! - else - if los_switcher == false then - - los_switcher = true - use_pathfind = false - - minetest_after(1, function(self) - if not self.object:get_luaentity() then - return - end - if has_lineofsight then self.path.following = false end - end, self) - end -- can see target! - end - - if (self.path.stuck_timer > stuck_timeout and not self.path.following) then - - use_pathfind = true - self.path.stuck_timer = 0 - - minetest_after(1, function(self) - if not self.object:get_luaentity() then - return - end - if has_lineofsight then self.path.following = false end - end, self) - end - - if (self.path.stuck_timer > stuck_path_timeout and self.path.following) then - - use_pathfind = true - self.path.stuck_timer = 0 - - minetest_after(1, function(self) - if not self.object:get_luaentity() then - return - end - if has_lineofsight then self.path.following = false end - end, self) - end - - if math_abs(vector.subtract(s,target_pos).y) > self.stepheight then - - if height_switcher then - use_pathfind = true - height_switcher = false - end - else - if not height_switcher then - use_pathfind = false - height_switcher = true - end - end - - if use_pathfind then - -- lets try find a path, first take care of positions - -- since pathfinder is very sensitive - local sheight = self.collisionbox[5] - self.collisionbox[2] - - -- round position to center of node to avoid stuck in walls - -- also adjust height for player models! - s.x = math_floor(s.x + 0.5) - s.z = math_floor(s.z + 0.5) - - local ssight, sground = minetest_line_of_sight(s, { - x = s.x, y = s.y - 4, z = s.z}, 1) - - -- determine node above ground - if not ssight then - s.y = sground.y + 1 - end - - local p1 = self.attack:get_pos() - - p1.x = math_floor(p1.x + 0.5) - p1.y = math_floor(p1.y + 0.5) - p1.z = math_floor(p1.z + 0.5) - - local dropheight = 12 - if self.fear_height ~= 0 then dropheight = self.fear_height end - local jumpheight = 0 - if self.jump and self.jump_height >= 4 then - jumpheight = math.min(math.ceil(self.jump_height / 4), 4) - elseif self.stepheight > 0.5 then - jumpheight = 1 - end - self.path.way = minetest_find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch") - - self.state = "" - do_attack(self, self.attack) - - -- no path found, try something else - if not self.path.way then - - self.path.following = false - - -- lets make way by digging/building if not accessible - if self.pathfinding == 2 and mobs_griefing then - - -- is player higher than mob? - if s.y < p1.y then - - -- build upwards - if not minetest_is_protected(s, "") then - - local ndef1 = minetest_registered_nodes[self.standing_in] - - if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then - - minetest_set_node(s, {name = mobs.fallback_node}) - end - end - - local sheight = math.ceil(self.collisionbox[5]) + 1 - - -- assume mob is 2 blocks high so it digs above its head - s.y = s.y + sheight - - -- remove one block above to make room to jump - if not minetest_is_protected(s, "") then - - local node1 = node_ok(s, "air").name - local ndef1 = minetest_registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest_set_node(s, {name = "air"}) - minetest_add_item(s, ItemStack(node1)) - - end - end - - s.y = s.y - sheight - self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) - - else -- dig 2 blocks to make door toward player direction - - local yaw1 = self.object:get_yaw() + math_pi / 2 - local p1 = { - x = s.x + math_cos(yaw1), - y = s.y, - z = s.z + math_sin(yaw1) - } - - if not minetest_is_protected(p1, "") then - - local node1 = node_ok(p1, "air").name - local ndef1 = minetest_registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest_add_item(p1, ItemStack(node1)) - minetest_set_node(p1, {name = "air"}) - end - - p1.y = p1.y + 1 - node1 = node_ok(p1, "air").name - ndef1 = minetest_registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest_add_item(p1, ItemStack(node1)) - minetest_set_node(p1, {name = "air"}) - end - - end - end - end - - -- will try again in 2 seconds - self.path.stuck_timer = stuck_timeout - 2 - elseif s.y < p1.y and (not self.fly) then - do_jump(self) --add jump to pathfinding - self.path.following = true - -- Yay, I found path! - -- TODO: Implement war_cry sound without being annoying - --mob_sound(self, "war_cry", true) - else - set_velocity(self, self.walk_velocity) - - -- follow path now that it has it - self.path.following = true - end - end -end - - --- specific attacks -local specific_attack = function(list, what) - - -- no list so attack default (player, animals etc.) - if list == nil then - return true - end - - -- found entity on list to attack? - for no = 1, #list do - - if list[no] == what then - return true - end - end - - return false -end - --- monster find someone to attack -local monster_attack = function(self) - - if self.type ~= "monster" - or not damage_enabled - or minetest_is_creative_enabled("") - or self.passive - or self.state == "attack" - or day_docile(self) then - return - end - - local s = self.object:get_pos() - local p, sp, dist - local player, obj, min_player - local type, name = "", "" - local min_dist = self.view_range + 1 - local objs = minetest_get_objects_inside_radius(s, self.view_range) - - for n = 1, #objs do - - if objs[n]:is_player() then - - if mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then - type = "" - else - player = objs[n] - type = "player" - name = "player" - end - else - obj = objs[n]:get_luaentity() - - if obj then - player = obj.object - type = obj.type - name = obj.name or "" - end - end - - -- find specific mob to attack, failing that attack player/npc/animal - if specific_attack(self.specific_attack, name) - and (type == "player" or type == "npc" - or (type == "animal" and self.attack_animals == true)) then - - p = player:get_pos() - sp = s - - dist = vector.distance(p, s) - - -- aim higher to make looking up hills more realistic - p.y = p.y + 1 - sp.y = sp.y + 1 - - - -- choose closest player to attack - if dist < min_dist - and line_of_sight(self, sp, p, 2) == true then - min_dist = dist - min_player = player - end - end - end - - -- attack player - if min_player then - do_attack(self, min_player) - end -end - - --- npc, find closest monster to attack -local npc_attack = function(self) - - if self.type ~= "npc" - or not self.attacks_monsters - or self.state == "attack" then - return - end - - local p, sp, obj, min_player - local s = self.object:get_pos() - local min_dist = self.view_range + 1 - local objs = minetest_get_objects_inside_radius(s, self.view_range) - - for n = 1, #objs do - - obj = objs[n]:get_luaentity() - - if obj and obj.type == "monster" then - - p = obj.object:get_pos() - sp = s - - local dist = vector.distance(p, s) - - -- aim higher to make looking up hills more realistic - p.y = p.y + 1 - sp.y = sp.y + 1 - - if dist < min_dist - and line_of_sight(self, sp, p, 2) == true then - min_dist = dist - min_player = obj.object - end - end - end - - if min_player then - do_attack(self, min_player) - end -end - - --- specific runaway -local specific_runaway = function(list, what) - - -- no list so do not run - if list == nil then - return false - end - - -- found entity on list to attack? - for no = 1, #list do - - if list[no] == what then - return true - end - end - - return false -end - - --- find someone to runaway from -local runaway_from = function(self) - - if not self.runaway_from and self.state ~= "flop" then - return - end - - local s = self.object:get_pos() - local p, sp, dist - local player, obj, min_player - local type, name = "", "" - local min_dist = self.view_range + 1 - local objs = minetest_get_objects_inside_radius(s, self.view_range) - - for n = 1, #objs do - - if objs[n]:is_player() then - - if mobs.invis[ objs[n]:get_player_name() ] - or self.owner == objs[n]:get_player_name() - or (not object_in_range(self, objs[n])) then - type = "" - else - player = objs[n] - type = "player" - name = "player" - end - else - obj = objs[n]:get_luaentity() - - if obj then - player = obj.object - type = obj.type - name = obj.name or "" - end - end - - -- find specific mob to runaway from - if name ~= "" and name ~= self.name - and specific_runaway(self.runaway_from, name) then - - p = player:get_pos() - sp = s - - -- aim higher to make looking up hills more realistic - p.y = p.y + 1 - sp.y = sp.y + 1 - - dist = vector.distance(p, s) - - - -- choose closest player/mpb to runaway from - if dist < min_dist - and line_of_sight(self, sp, p, 2) == true then - min_dist = dist - min_player = player - end - end - end - - if min_player then - - local lp = player:get_pos() - local vec = { - x = lp.x - s.x, - y = lp.y - s.y, - z = lp.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + 3 * math_pi / 2) - self.rotate - - if lp.x > s.x then - yaw = yaw + math_pi - end - - yaw = set_yaw(self, yaw, 4) - self.state = "runaway" - self.runaway_timer = 3 - self.following = nil - end -end - - --- follow player if owner or holding item, if fish outta water then flop -local follow_flop = function(self) - - -- find player to follow - if (self.follow ~= "" - or self.order == "follow") - and not self.following - and self.state ~= "attack" - and self.order ~= "sit" - and self.state ~= "runaway" then - - local s = self.object:get_pos() - local players = minetest.get_connected_players() - - for n = 1, #players do - - if (object_in_range(self, players[n])) - and not mobs.invis[ players[n]:get_player_name() ] then - - self.following = players[n] - - break - end - end - end - - if self.type == "npc" - and self.order == "follow" - and self.state ~= "attack" - and self.order ~= "sit" - and self.owner ~= "" then - - -- npc stop following player if not owner - if self.following - and self.owner - and self.owner ~= self.following:get_player_name() then - self.following = nil - end - else - -- stop following player if not holding specific item, - -- mob is horny, fleeing or attacking - if self.following - and self.following:is_player() - and (follow_holding(self, self.following) == false or - self.horny or self.state == "runaway") then - self.following = nil - end - - end - - -- follow that thing - if self.following then - - local s = self.object:get_pos() - local p - - if self.following:is_player() then - - p = self.following:get_pos() - - elseif self.following.object then - - p = self.following.object:get_pos() - end - - if p then - - local dist = vector.distance(p, s) - - -- dont follow if out of range - if (not object_in_range(self, self.following)) then - self.following = nil - else - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + math_pi end - - set_yaw(self, yaw, 2.35) - - -- anyone but standing npc's can move along - if dist > 3 - and self.order ~= "stand" then - - set_velocity(self, self.follow_velocity) - - if self.walk_chance ~= 0 then - set_animation(self, "run") - end - else - set_velocity(self, 0) - set_animation(self, "stand") - end - - return - end - end - end - - -- swimmers flop when out of their element, and swim again when back in - if self.fly then - local s = self.object:get_pos() - if not flight_check(self, s) then - - self.state = "flop" - self.object:set_acceleration({x = 0, y = DEFAULT_FALL_SPEED, z = 0}) - - local sdef = minetest_registered_nodes[self.standing_on] - -- Flop on ground - if sdef and sdef.walkable then - mob_sound(self, "flop") - self.object:set_velocity({ - x = math_random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), - y = FLOP_HEIGHT, - z = math_random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), - }) - end - - set_animation(self, "stand", true) - - return - elseif self.state == "flop" then - self.state = "stand" - self.object:set_acceleration({x = 0, y = 0, z = 0}) - set_velocity(self, 0) - end - end -end - - --- dogshoot attack switch and counter function -local dogswitch = function(self, dtime) - - -- switch mode not activated - if not self.dogshoot_switch - or not dtime then - return 0 - end - - self.dogshoot_count = self.dogshoot_count + dtime - - if (self.dogshoot_switch == 1 - and self.dogshoot_count > self.dogshoot_count_max) - or (self.dogshoot_switch == 2 - and self.dogshoot_count > self.dogshoot_count2_max) then - - self.dogshoot_count = 0 - - if self.dogshoot_switch == 1 then - self.dogshoot_switch = 2 - else - self.dogshoot_switch = 1 - end - end - - return self.dogshoot_switch -end -- execute current state (stand, walk, run, attacks) -- returns true if mob has died @@ -2936,110 +1785,6 @@ local do_states = function(self, dtime) end end - --- falling and fall damage --- returns true if mob died -local falling = function(self, pos) - - if self.fly and self.state ~= "die" then - return - end - - if mcl_portals ~= nil then - if mcl_portals.nether_portal_cooloff(self.object) then - return false -- mob has teleported through Nether portal - it's 99% not falling - end - end - - -- floating in water (or falling) - local v = self.object:get_velocity() - - if v.y > 0 then - - -- apply gravity when moving up - self.object:set_acceleration({ - x = 0, - y = -10, - z = 0 - }) - - elseif v.y <= 0 and v.y > self.fall_speed then - - -- fall downwards at set speed - self.object:set_acceleration({ - x = 0, - y = self.fall_speed, - z = 0 - }) - else - -- stop accelerating once max fall speed hit - self.object:set_acceleration({x = 0, y = 0, z = 0}) - end - - if minetest_registered_nodes[node_ok(pos).name].groups.lava then - - if self.floats_on_lava == 1 then - - self.object:set_acceleration({ - x = 0, - y = -self.fall_speed / (max(1, v.y) ^ 2), - z = 0 - }) - end - end - - -- in water then float up - if minetest_registered_nodes[node_ok(pos).name].groups.water then - - if self.floats == 1 then - - self.object:set_acceleration({ - x = 0, - y = -self.fall_speed / (math_max(1, v.y) ^ 2), - z = 0 - }) - end - else - - -- fall damage onto solid ground - if self.fall_damage == 1 - and self.object:get_velocity().y == 0 then - - local d = (self.old_y or 0) - self.object:get_pos().y - - if d > 5 then - - local add = minetest_get_item_group(self.standing_on, "fall_damage_add_percent") - local damage = d - 5 - if add ~= 0 then - damage = damage + damage * (add/100) - end - damage = math_floor(damage) - if damage > 0 then - self.health = self.health - damage - - effect(pos, 5, "mcl_particles_smoke.png", 1, 2, 2, nil) - - if check_for_death(self, "fall", {type = "fall"}) then - return true - end - end - end - - self.old_y = self.object:get_pos().y - end - end -end - -local teleport = function(self, target) - if self.do_teleport then - if self.do_teleport(self, target) == false then - return - end - end -end - - -- deal damage and effects when mob punched local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) @@ -3720,34 +2465,7 @@ local mob_step = function(self, dtime) node = minetest_get_node_or_nil(p) if node then nn = node.name - def = minetest_registered_nodes[nn] - end - - -- Move item around on flowing liquids - if def and def.liquidtype == "flowing" then - - -- Get flowing direction (function call from flowlib), if there's a liquid. - NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. - Luckily, this is exactly what we need if we only care about water, which has this flowing distance. - local vec = flowlib.quick_flow(p, node) - -- Just to make sure we don't manipulate the speed for no reason - if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then - -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" - local f = 1.39 - -- Set new item moving speed into the direciton of the liquid - local newv = vector.multiply(vec, f) - self.object:set_acceleration({x = 0, y = 0, z = 0}) - self.object:set_velocity({x = newv.x, y = -0.22, z = newv.z}) - - self.physical_state = true - self._flowing = true - self.object:set_properties({ - physical = true - }) - return - end - elseif self._flowing == true then - -- Disable flowing physics if not on/in flowing liquid + def = minetest_registered_nodes[nnenable_physicss if not on/in flowing liquid self._flowing = false enable_physics(self.object, self, true) return @@ -3869,6 +2587,63 @@ if collisionbox[5] < 0.79 then collisionbox[5] = 0.79 end + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + minetest.register_entity(name, { use_texture_alpha = def.use_texture_alpha, @@ -4154,35 +2929,6 @@ function mobs:register_arrow(name, def) }) end - --- no damage to nodes explosion -function mobs:safe_boom(self, pos, strength) - minetest_sound_play(self.sounds and self.sounds.explode or "tnt_explode", { - pos = pos, - gain = 1.0, - max_hear_distance = self.sounds and self.sounds.distance or 32 - }, true) - local radius = strength - entity_physics(pos, radius) - effect(pos, 32, "mcl_particles_smoke.png", radius * 3, radius * 5, radius, 1, 0) -end - - --- make explosion with protection and tnt mod check -function mobs:boom(self, pos, strength, fire) - self.object:remove() - if mod_explosions then - if mobs_griefing and not minetest_is_protected(pos, "") then - mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object) - else - mobs:safe_boom(self, pos, strength) - end - else - mobs:safe_boom(self, pos, strength) - end -end - - -- Register spawn eggs -- Note: This also introduces the “spawn_egg” group: @@ -4293,179 +3039,3 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) end --- No-op in MCL2 (capturing mobs is not possible). --- Provided for compability with Mobs Redo -function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) - return false -end - - --- No-op in MCL2 (protecting mobs is not possible). -function mobs:protect(self, clicker) - return false -end - - --- feeding, taming and breeding (thanks blert2112) -function mobs:feed_tame(self, clicker, feed_count, breed, tame) - if not self.follow then - return false - end - - -- can eat/tame with item in hand - if follow_holding(self, clicker) then - - -- if not in creative then take item - if not mobs.is_creative(clicker:get_player_name()) then - - local item = clicker:get_wielded_item() - - item:take_item() - - clicker:set_wielded_item(item) - end - - mob_sound(self, "eat", nil, true) - - -- increase health - self.health = self.health + 4 - - if self.health >= self.hp_max then - - self.health = self.hp_max - - if self.htimer < 1 then - self.htimer = 5 - end - end - - self.object:set_hp(self.health) - - update_tag(self) - - -- make children grow quicker - if self.child == true then - - -- deduct 10% of the time to adulthood - self.hornytimer = self.hornytimer + ((CHILD_GROW_TIME - self.hornytimer) * 0.1) - - return true - end - - -- feed and tame - self.food = (self.food or 0) + 1 - if self.food >= feed_count then - - self.food = 0 - - if breed and self.hornytimer == 0 then - self.horny = true - end - - if tame then - - self.tamed = true - - if not self.owner or self.owner == "" then - self.owner = clicker:get_player_name() - end - end - - -- make sound when fed so many times - mob_sound(self, "random", true) - end - - return true - end - - return false -end - --- Spawn a child -function mobs:spawn_child(pos, mob_type) - local child = minetest_add_entity(pos, mob_type) - if not child then - return - end - - local ent = child:get_luaentity() - effect(pos, 15, "mcl_particles_smoke.png", 1, 2, 2, 15, 5) - - ent.child = true - - local textures - -- using specific child texture (if found) - if ent.child_texture then - textures = ent.child_texture[1] - end - - -- and resize to half height - child:set_properties({ - textures = textures, - visual_size = { - x = ent.base_size.x * .5, - y = ent.base_size.y * .5, - }, - collisionbox = { - ent.base_colbox[1] * .5, - ent.base_colbox[2] * .5, - ent.base_colbox[3] * .5, - ent.base_colbox[4] * .5, - ent.base_colbox[5] * .5, - ent.base_colbox[6] * .5, - }, - selectionbox = { - ent.base_selbox[1] * .5, - ent.base_selbox[2] * .5, - ent.base_selbox[3] * .5, - ent.base_selbox[4] * .5, - ent.base_selbox[5] * .5, - ent.base_selbox[6] * .5, - }, - }) - - return child -end - - --- compatibility function for old entities to new modpack entities -function mobs:alias_mob(old_name, new_name) - - -- spawn egg - minetest.register_alias(old_name, new_name) - - -- entity - minetest.register_entity(":" .. old_name, { - - physical = false, - - on_step = function(self) - - if minetest_registered_entities[new_name] then - minetest_add_entity(self.object:get_pos(), new_name) - end - - self.object:remove() - end - }) - -end - ---[[ -local timer = 0 -minetest.register_globalstep(function(dtime) - timer = timer + dtime - if timer < 1 then return end - for _, player in pairs(minetest.get_connected_players()) do - local pos = player:get_pos() - for _, obj in pairs(minetest_get_objects_inside_radius(pos, 47)) do - local lua = obj:get_luaentity() - if lua and lua._cmi_is_mob then - lua.lifetimer = math.max(20, lua.lifetimer) - lua.despawn_immediately = false - end - end - end - timer = 0 -end) -]]-- \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/backup_code_api.lua new file mode 100644 index 0000000000..ba4b8452af --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/backup_code_api.lua @@ -0,0 +1,1466 @@ +local disable_physics = function(object, luaentity, ignore_check, reset_movement) + if luaentity.physical_state == true or ignore_check == true then + luaentity.physical_state = false + object:set_properties({ + physical = false + }) + if reset_movement ~= false then + object:set_velocity({x=0,y=0,z=0}) + object:set_acceleration({x=0,y=0,z=0}) + end + end +end + +----For Water Flowing: +local enable_physics = function(object, luaentity, ignore_check) + if luaentity.physical_state == false or ignore_check == true then + luaentity.physical_state = true + object:set_properties({ + physical = true + }) + object:set_velocity({x=0,y=0,z=0}) + object:set_acceleration({x=0,y=-9.81,z=0}) + end +end + +--[[ +local timer = 0 +minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < 1 then return end + for _, player in pairs(minetest.get_connected_players()) do + local pos = player:get_pos() + for _, obj in pairs(minetest_get_objects_inside_radius(pos, 47)) do + local lua = obj:get_luaentity() + if lua and lua._cmi_is_mob then + lua.lifetimer = math.max(20, lua.lifetimer) + lua.despawn_immediately = false + end + end + end + timer = 0 +end) +]]-- + +-- compatibility function for old entities to new modpack entities +function mobs:alias_mob(old_name, new_name) + + -- spawn egg + minetest.register_alias(old_name, new_name) + + -- entity + minetest.register_entity(":" .. old_name, { + + physical = false, + + on_step = function(self) + + if minetest_registered_entities[new_name] then + minetest_add_entity(self.object:get_pos(), new_name) + end + + self.object:remove() + end + }) +end + + +-- Spawn a child +function mobs:spawn_child(pos, mob_type) + local child = minetest_add_entity(pos, mob_type) + if not child then + return + end + + local ent = child:get_luaentity() + effect(pos, 15, "mcl_particles_smoke.png", 1, 2, 2, 15, 5) + + ent.child = true + + local textures + -- using specific child texture (if found) + if ent.child_texture then + textures = ent.child_texture[1] + end + + -- and resize to half height + child:set_properties({ + textures = textures, + visual_size = { + x = ent.base_size.x * .5, + y = ent.base_size.y * .5, + }, + collisionbox = { + ent.base_colbox[1] * .5, + ent.base_colbox[2] * .5, + ent.base_colbox[3] * .5, + ent.base_colbox[4] * .5, + ent.base_colbox[5] * .5, + ent.base_colbox[6] * .5, + }, + selectionbox = { + ent.base_selbox[1] * .5, + ent.base_selbox[2] * .5, + ent.base_selbox[3] * .5, + ent.base_selbox[4] * .5, + ent.base_selbox[5] * .5, + ent.base_selbox[6] * .5, + }, + }) + + return child +end + + +-- No-op in MCL2 (capturing mobs is not possible). +-- Provided for compability with Mobs Redo +function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) + return false +end + + +-- No-op in MCL2 (protecting mobs is not possible). +function mobs:protect(self, clicker) + return false +end + + +-- feeding, taming and breeding (thanks blert2112) +function mobs:feed_tame(self, clicker, feed_count, breed, tame) + if not self.follow then + return false + end + + -- can eat/tame with item in hand + if follow_holding(self, clicker) then + + -- if not in creative then take item + if not mobs.is_creative(clicker:get_player_name()) then + + local item = clicker:get_wielded_item() + + item:take_item() + + clicker:set_wielded_item(item) + end + + mob_sound(self, "eat", nil, true) + + -- increase health + self.health = self.health + 4 + + if self.health >= self.hp_max then + + self.health = self.hp_max + + if self.htimer < 1 then + self.htimer = 5 + end + end + + self.object:set_hp(self.health) + + update_tag(self) + + -- make children grow quicker + if self.child == true then + + -- deduct 10% of the time to adulthood + self.hornytimer = self.hornytimer + ((CHILD_GROW_TIME - self.hornytimer) * 0.1) + + return true + end + + -- feed and tame + self.food = (self.food or 0) + 1 + if self.food >= feed_count then + + self.food = 0 + + if breed and self.hornytimer == 0 then + self.horny = true + end + + if tame then + + self.tamed = true + + if not self.owner or self.owner == "" then + self.owner = clicker:get_player_name() + end + end + + -- make sound when fed so many times + mob_sound(self, "random", true) + end + + return true + end + + return false +end + +-- no damage to nodes explosion +function mobs:safe_boom(self, pos, strength) + minetest_sound_play(self.sounds and self.sounds.explode or "tnt_explode", { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds and self.sounds.distance or 32 + }, true) + local radius = strength + entity_physics(pos, radius) + effect(pos, 32, "mcl_particles_smoke.png", radius * 3, radius * 5, radius, 1, 0) +end + + +-- make explosion with protection and tnt mod check +function mobs:boom(self, pos, strength, fire) + self.object:remove() + if mod_explosions then + if mobs_griefing and not minetest_is_protected(pos, "") then + mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object) + else + mobs:safe_boom(self, pos, strength) + end + else + mobs:safe_boom(self, pos, strength) + end +end + +-- falling and fall damage +-- returns true if mob died +local falling = function(self, pos) + + if self.fly and self.state ~= "die" then + return + end + + if mcl_portals ~= nil then + if mcl_portals.nether_portal_cooloff(self.object) then + return false -- mob has teleported through Nether portal - it's 99% not falling + end + end + + -- floating in water (or falling) + local v = self.object:get_velocity() + + if v.y > 0 then + + -- apply gravity when moving up + self.object:set_acceleration({ + x = 0, + y = -10, + z = 0 + }) + + elseif v.y <= 0 and v.y > self.fall_speed then + + -- fall downwards at set speed + self.object:set_acceleration({ + x = 0, + y = self.fall_speed, + z = 0 + }) + else + -- stop accelerating once max fall speed hit + self.object:set_acceleration({x = 0, y = 0, z = 0}) + end + + if minetest_registered_nodes[node_ok(pos).name].groups.lava then + + if self.floats_on_lava == 1 then + + self.object:set_acceleration({ + x = 0, + y = -self.fall_speed / (max(1, v.y) ^ 2), + z = 0 + }) + end + end + + -- in water then float up + if minetest_registered_nodes[node_ok(pos).name].groups.water then + + if self.floats == 1 then + + self.object:set_acceleration({ + x = 0, + y = -self.fall_speed / (math_max(1, v.y) ^ 2), + z = 0 + }) + end + else + + -- fall damage onto solid ground + if self.fall_damage == 1 + and self.object:get_velocity().y == 0 then + + local d = (self.old_y or 0) - self.object:get_pos().y + + if d > 5 then + + local add = minetest_get_item_group(self.standing_on, "fall_damage_add_percent") + local damage = d - 5 + if add ~= 0 then + damage = damage + damage * (add/100) + end + damage = math_floor(damage) + if damage > 0 then + self.health = self.health - damage + + effect(pos, 5, "mcl_particles_smoke.png", 1, 2, 2, nil) + + if check_for_death(self, "fall", {type = "fall"}) then + return true + end + end + end + + self.old_y = self.object:get_pos().y + end + end +end + +local teleport = function(self, target) + if self.do_teleport then + if self.do_teleport(self, target) == false then + return + end + end +end + + +-- find someone to runaway from +local runaway_from = function(self) + + if not self.runaway_from and self.state ~= "flop" then + return + end + + local s = self.object:get_pos() + local p, sp, dist + local player, obj, min_player + local type, name = "", "" + local min_dist = self.view_range + 1 + local objs = minetest_get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + if objs[n]:is_player() then + + if mobs.invis[ objs[n]:get_player_name() ] + or self.owner == objs[n]:get_player_name() + or (not object_in_range(self, objs[n])) then + type = "" + else + player = objs[n] + type = "player" + name = "player" + end + else + obj = objs[n]:get_luaentity() + + if obj then + player = obj.object + type = obj.type + name = obj.name or "" + end + end + + -- find specific mob to runaway from + if name ~= "" and name ~= self.name + and specific_runaway(self.runaway_from, name) then + + p = player:get_pos() + sp = s + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + dist = vector.distance(p, s) + + + -- choose closest player/mpb to runaway from + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + end + end + + if min_player then + + local lp = player:get_pos() + local vec = { + x = lp.x - s.x, + y = lp.y - s.y, + z = lp.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + 3 * math_pi / 2) - self.rotate + + if lp.x > s.x then + yaw = yaw + math_pi + end + + yaw = set_yaw(self, yaw, 4) + self.state = "runaway" + self.runaway_timer = 3 + self.following = nil + end +end + + +-- specific runaway +local specific_runaway = function(list, what) + + -- no list so do not run + if list == nil then + return false + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + + +-- follow player if owner or holding item, if fish outta water then flop +local follow_flop = function(self) + + -- find player to follow + if (self.follow ~= "" + or self.order == "follow") + and not self.following + and self.state ~= "attack" + and self.order ~= "sit" + and self.state ~= "runaway" then + + local s = self.object:get_pos() + local players = minetest.get_connected_players() + + for n = 1, #players do + + if (object_in_range(self, players[n])) + and not mobs.invis[ players[n]:get_player_name() ] then + + self.following = players[n] + + break + end + end + end + + if self.type == "npc" + and self.order == "follow" + and self.state ~= "attack" + and self.order ~= "sit" + and self.owner ~= "" then + + -- npc stop following player if not owner + if self.following + and self.owner + and self.owner ~= self.following:get_player_name() then + self.following = nil + end + else + -- stop following player if not holding specific item, + -- mob is horny, fleeing or attacking + if self.following + and self.following:is_player() + and (follow_holding(self, self.following) == false or + self.horny or self.state == "runaway") then + self.following = nil + end + + end + + -- follow that thing + if self.following then + + local s = self.object:get_pos() + local p + + if self.following:is_player() then + + p = self.following:get_pos() + + elseif self.following.object then + + p = self.following.object:get_pos() + end + + if p then + + local dist = vector.distance(p, s) + + -- dont follow if out of range + if (not object_in_range(self, self.following)) then + self.following = nil + else + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + math_pi end + + set_yaw(self, yaw, 2.35) + + -- anyone but standing npc's can move along + if dist > 3 + and self.order ~= "stand" then + + set_velocity(self, self.follow_velocity) + + if self.walk_chance ~= 0 then + set_animation(self, "run") + end + else + set_velocity(self, 0) + set_animation(self, "stand") + end + + return + end + end + end + + -- swimmers flop when out of their element, and swim again when back in + if self.fly then + local s = self.object:get_pos() + if not flight_check(self, s) then + + self.state = "flop" + self.object:set_acceleration({x = 0, y = DEFAULT_FALL_SPEED, z = 0}) + + local sdef = minetest_registered_nodes[self.standing_on] + -- Flop on ground + if sdef and sdef.walkable then + mob_sound(self, "flop") + self.object:set_velocity({ + x = math_random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), + y = FLOP_HEIGHT, + z = math_random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), + }) + end + + set_animation(self, "stand", true) + + return + elseif self.state == "flop" then + self.state = "stand" + self.object:set_acceleration({x = 0, y = 0, z = 0}) + set_velocity(self, 0) + end + end +end + + +-- npc, find closest monster to attack +local npc_attack = function(self) + + if self.type ~= "npc" + or not self.attacks_monsters + or self.state == "attack" then + return + end + + local p, sp, obj, min_player + local s = self.object:get_pos() + local min_dist = self.view_range + 1 + local objs = minetest_get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + obj = objs[n]:get_luaentity() + + if obj and obj.type == "monster" then + + p = obj.object:get_pos() + sp = s + + local dist = vector.distance(p, s) + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = obj.object + end + end + end + + if min_player then + do_attack(self, min_player) + end +end + + +-- monster find someone to attack +local monster_attack = function(self) + + if self.type ~= "monster" + or not damage_enabled + or minetest_is_creative_enabled("") + or self.passive + or self.state == "attack" + or day_docile(self) then + return + end + + local s = self.object:get_pos() + local p, sp, dist + local player, obj, min_player + local type, name = "", "" + local min_dist = self.view_range + 1 + local objs = minetest_get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + if objs[n]:is_player() then + + if mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then + type = "" + else + player = objs[n] + type = "player" + name = "player" + end + else + obj = objs[n]:get_luaentity() + + if obj then + player = obj.object + type = obj.type + name = obj.name or "" + end + end + + -- find specific mob to attack, failing that attack player/npc/animal + if specific_attack(self.specific_attack, name) + and (type == "player" or type == "npc" + or (type == "animal" and self.attack_animals == true)) then + + p = player:get_pos() + sp = s + + dist = vector.distance(p, s) + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + + -- choose closest player to attack + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + end + end + + -- attack player + if min_player then + do_attack(self, min_player) + end +end + + +-- specific attacks +local specific_attack = function(list, what) + + -- no list so attack default (player, animals etc.) + if list == nil then + return true + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + + +-- dogfight attack switch and counter function +local dogswitch = function(self, dtime) + + -- switch mode not activated + if not self.dogshoot_switch + or not dtime then + return 0 + end + + self.dogshoot_count = self.dogshoot_count + dtime + + if (self.dogshoot_switch == 1 + and self.dogshoot_count > self.dogshoot_count_max) + or (self.dogshoot_switch == 2 + and self.dogshoot_count > self.dogshoot_count2_max) then + + self.dogshoot_count = 0 + + if self.dogshoot_switch == 1 then + self.dogshoot_switch = 2 + else + self.dogshoot_switch = 1 + end + end + + return self.dogshoot_switch +end + +-- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 +local smart_mobs = function(self, s, p, dist, dtime) + + local s1 = self.path.lastpos + + local target_pos = self.attack:get_pos() + + -- is it becoming stuck? + if math_abs(s1.x - s.x) + math_abs(s1.z - s.z) < .5 then + self.path.stuck_timer = self.path.stuck_timer + dtime + else + self.path.stuck_timer = 0 + end + + self.path.lastpos = {x = s.x, y = s.y, z = s.z} + + local use_pathfind = false + local has_lineofsight = minetest_line_of_sight( + {x = s.x, y = (s.y) + .5, z = s.z}, + {x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2) + + -- im stuck, search for path + if not has_lineofsight then + + if los_switcher == true then + use_pathfind = true + los_switcher = false + end -- cannot see target! + else + if los_switcher == false then + + los_switcher = true + use_pathfind = false + + minetest_after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end -- can see target! + end + + if (self.path.stuck_timer > stuck_timeout and not self.path.following) then + + use_pathfind = true + self.path.stuck_timer = 0 + + minetest_after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end + + if (self.path.stuck_timer > stuck_path_timeout and self.path.following) then + + use_pathfind = true + self.path.stuck_timer = 0 + + minetest_after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end + + if math_abs(vector.subtract(s,target_pos).y) > self.stepheight then + + if height_switcher then + use_pathfind = true + height_switcher = false + end + else + if not height_switcher then + use_pathfind = false + height_switcher = true + end + end + + if use_pathfind then + -- lets try find a path, first take care of positions + -- since pathfinder is very sensitive + local sheight = self.collisionbox[5] - self.collisionbox[2] + + -- round position to center of node to avoid stuck in walls + -- also adjust height for player models! + s.x = math_floor(s.x + 0.5) + s.z = math_floor(s.z + 0.5) + + local ssight, sground = minetest_line_of_sight(s, { + x = s.x, y = s.y - 4, z = s.z}, 1) + + -- determine node above ground + if not ssight then + s.y = sground.y + 1 + end + + local p1 = self.attack:get_pos() + + p1.x = math_floor(p1.x + 0.5) + p1.y = math_floor(p1.y + 0.5) + p1.z = math_floor(p1.z + 0.5) + + local dropheight = 12 + if self.fear_height ~= 0 then dropheight = self.fear_height end + local jumpheight = 0 + if self.jump and self.jump_height >= 4 then + jumpheight = math.min(math.ceil(self.jump_height / 4), 4) + elseif self.stepheight > 0.5 then + jumpheight = 1 + end + self.path.way = minetest_find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch") + + self.state = "" + do_attack(self, self.attack) + + -- no path found, try something else + if not self.path.way then + + self.path.following = false + + -- lets make way by digging/building if not accessible + if self.pathfinding == 2 and mobs_griefing then + + -- is player higher than mob? + if s.y < p1.y then + + -- build upwards + if not minetest_is_protected(s, "") then + + local ndef1 = minetest_registered_nodes[self.standing_in] + + if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then + + minetest_set_node(s, {name = mobs.fallback_node}) + end + end + + local sheight = math.ceil(self.collisionbox[5]) + 1 + + -- assume mob is 2 blocks high so it digs above its head + s.y = s.y + sheight + + -- remove one block above to make room to jump + if not minetest_is_protected(s, "") then + + local node1 = node_ok(s, "air").name + local ndef1 = minetest_registered_nodes[node1] + + if node1 ~= "air" + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then + + minetest_set_node(s, {name = "air"}) + minetest_add_item(s, ItemStack(node1)) + + end + end + + s.y = s.y - sheight + self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) + + else -- dig 2 blocks to make door toward player direction + + local yaw1 = self.object:get_yaw() + math_pi / 2 + local p1 = { + x = s.x + math_cos(yaw1), + y = s.y, + z = s.z + math_sin(yaw1) + } + + if not minetest_is_protected(p1, "") then + + local node1 = node_ok(p1, "air").name + local ndef1 = minetest_registered_nodes[node1] + + if node1 ~= "air" + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then + + minetest_add_item(p1, ItemStack(node1)) + minetest_set_node(p1, {name = "air"}) + end + + p1.y = p1.y + 1 + node1 = node_ok(p1, "air").name + ndef1 = minetest_registered_nodes[node1] + + if node1 ~= "air" + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then + + minetest_add_item(p1, ItemStack(node1)) + minetest_set_node(p1, {name = "air"}) + end + + end + end + end + + -- will try again in 2 seconds + self.path.stuck_timer = stuck_timeout - 2 + elseif s.y < p1.y and (not self.fly) then + do_jump(self) --add jump to pathfinding + self.path.following = true + -- Yay, I found path! + -- TODO: Implement war_cry sound without being annoying + --mob_sound(self, "war_cry", true) + else + set_velocity(self, self.walk_velocity) + + -- follow path now that it has it + self.path.following = true + end + end +end + +local update_tag = function(self) + local tag + if mobs_debug then + tag = "nametag = '"..tostring(self.nametag).."'\n".. + "state = '"..tostring(self.state).."'\n".. + "order = '"..tostring(self.order).."'\n".. + "attack = "..tostring(self.attack).."\n".. + "health = "..tostring(self.health).."\n".. + "breath = "..tostring(self.breath).."\n".. + "gotten = "..tostring(self.gotten).."\n".. + "tamed = "..tostring(self.tamed).."\n".. + "horny = "..tostring(self.horny).."\n".. + "hornytimer = "..tostring(self.hornytimer).."\n".. + "runaway_timer = "..tostring(self.runaway_timer).."\n".. + "following = "..tostring(self.following) + else + tag = self.nametag + end + self.object:set_properties({ + nametag = tag, + }) + + update_roll(self) +end + +-- drop items +local item_drop = function(self, cooked, looting_level) + + -- no drops if disabled by setting + if not mobs_drop_items then return end + + looting_level = looting_level or 0 + + -- no drops for child mobs (except monster) + if (self.child and self.type ~= "monster") then + return + end + + local obj, item, num + local pos = self.object:get_pos() + + self.drops = self.drops or {} -- nil check + + for n = 1, #self.drops do + local dropdef = self.drops[n] + local chance = 1 / dropdef.chance + local looting_type = dropdef.looting + + if looting_level > 0 then + local chance_function = dropdef.looting_chance_function + if chance_function then + chance = chance_function(looting_level) + elseif looting_type == "rare" then + chance = chance + (dropdef.looting_factor or 0.01) * looting_level + end + end + + local num = 0 + local do_common_looting = (looting_level > 0 and looting_type == "common") + if math_random() < chance then + num = math_random(dropdef.min or 1, dropdef.max or 1) + elseif not dropdef.looting_ignore_chance then + do_common_looting = false + end + + if do_common_looting then + num = num + math_floor(math_random(0, looting_level) + 0.5) + end + + if num > 0 then + item = dropdef.name + + -- cook items when true + if cooked then + + 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() + end + end + + -- add item if it exists + for x = 1, num do + obj = minetest_add_item(pos, ItemStack(item .. " " .. 1)) + end + + if obj and obj:get_luaentity() then + + obj:set_velocity({ + x = math_random(-10, 10) / 9, + y = 6, + z = math_random(-10, 10) / 9, + }) + elseif obj then + obj:remove() -- item does not exist + end + end + end + + self.drops = {} +end + + +-- check if mob is dead or only hurt +local check_for_death = function(self, cause, cmi_cause) + + if self.state == "die" then + return true + end + + -- has health actually changed? + if self.health == self.old_health and self.health > 0 then + return false + end + + local damaged = self.health < self.old_health + self.old_health = self.health + + -- still got some health? + if self.health > 0 then + + -- make sure health isn't higher than max + if self.health > self.hp_max then + self.health = self.hp_max + end + + -- play damage sound if health was reduced and make mob flash red. + if damaged then + add_texture_mod(self, "^[colorize:red:130") + minetest_after(.2, function(self) + if self and self.object then + remove_texture_mod(self, "^[colorize:red:130") + end + end, self) + mob_sound(self, "damage") + end + + -- backup nametag so we can show health stats + if not self.nametag2 then + self.nametag2 = self.nametag or "" + end + + if show_health + and (cmi_cause and cmi_cause.type == "punch") then + + self.htimer = 2 + self.nametag = "♥ " .. self.health .. " / " .. self.hp_max + + update_tag(self) + end + + return false + end + + mob_sound(self, "death") + + local function death_handle(self) + -- dropped cooked item if mob died in fire or lava + if cause == "lava" or cause == "fire" then + item_drop(self, true, 0) + else + local wielditem = ItemStack() + if cause == "hit" then + local puncher = cmi_cause.puncher + if puncher then + wielditem = puncher:get_wielded_item() + end + end + local cooked = mcl_burning.is_burning(self.object) or mcl_enchanting.has_enchantment(wielditem, "fire_aspect") + local looting = mcl_enchanting.get_enchantment(wielditem, "looting") + 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)) + end + end + end + + -- execute custom death function + if self.on_die then + + local pos = self.object:get_pos() + local on_die_exit = self.on_die(self, pos, cmi_cause) + if on_die_exit ~= true then + death_handle(self) + end + + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + + if on_die_exit == true then + self.state = "die" + mcl_burning.extinguish(self.object) + self.object:remove() + return true + end + end + + local collisionbox + if self.collisionbox then + collisionbox = table.copy(self.collisionbox) + end + + self.state = "die" + self.attack = nil + self.v_start = false + self.fall_speed = DEFAULT_FALL_SPEED + self.timer = 0 + self.blinktimer = 0 + remove_texture_mod(self, "^[colorize:#FF000040") + remove_texture_mod(self, "^[brighten") + self.passive = true + + self.object:set_properties({ + pointable = false, + collide_with_objects = false, + }) + + set_velocity(self, 0) + local acc = self.object:get_acceleration() + acc.x, acc.y, acc.z = 0, DEFAULT_FALL_SPEED, 0 + self.object:set_acceleration(acc) + + local length + -- default death function and die animation (if defined) + if self.instant_death then + length = 0 + elseif self.animation + and self.animation.die_start + and self.animation.die_end then + + local frames = self.animation.die_end - self.animation.die_start + local speed = self.animation.die_speed or 15 + length = max(frames / speed, 0) + DEATH_DELAY + set_animation(self, "die") + else + local rot = self.object:get_rotation() + rot.z = math_pi/2 + self.object:set_rotation(rot) + length = 1 + DEATH_DELAY + set_animation(self, "stand", true) + end + + + -- Remove body after a few seconds and drop stuff + local kill = function(self) + if not self.object:get_luaentity() then + return + end + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + + death_handle(self) + local dpos = self.object:get_pos() + local cbox = self.collisionbox + local yaw = self.object:get_rotation().y + mcl_burning.extinguish(self.object) + self.object:remove() + mobs.death_effect(dpos, yaw, cbox, not self.instant_death) + end + if length <= 0 then + kill(self) + else + minetest_after(length, kill, self) + end + + return true +end + +local damage_effect = function(self, damage) + -- damage particles + if (not disable_blood) and damage > 0 then + + local amount_large = math_floor(damage / 2) + local amount_small = damage % 2 + + local pos = self.object:get_pos() + + pos.y = pos.y + (self.collisionbox[5] - self.collisionbox[2]) * .5 + + local texture = "mobs_blood.png" + -- full heart damage (one particle for each 2 HP damage) + if amount_large > 0 then + effect(pos, amount_large, texture, 2, 2, 1.75, 0, nil, true) + end + -- half heart damage (one additional particle if damage is an odd number) + if amount_small > 0 then + -- TODO: Use "half heart" + effect(pos, amount_small, texture, 1, 1, 1.75, 0, nil, true) + end + end +end + + +-- custom particle effects +local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down) + + radius = radius or 2 + min_size = min_size or 0.5 + max_size = max_size or 1 + gravity = gravity or -10 + glow = glow or 0 + go_down = go_down or false + + local ym + if go_down then + ym = 0 + else + ym = -radius + end + + minetest_add_particlespawner({ + amount = amount, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = {x = -radius, y = ym, z = -radius}, + maxvel = {x = radius, y = radius, z = radius}, + minacc = {x = 0, y = gravity, z = 0}, + maxacc = {x = 0, y = gravity, z = 0}, + minexptime = 0.1, + maxexptime = 1, + minsize = min_size, + maxsize = max_size, + texture = texture, + glow = glow, + }) +end + + +-- are we flying in what we are suppose to? (taikedz) +local flight_check = function(self) + + local nod = self.standing_in + local def = minetest_registered_nodes[nod] + + if not def then return false end -- nil check + + local fly_in + if type(self.fly_in) == "string" then + fly_in = { self.fly_in } + elseif type(self.fly_in) == "table" then + fly_in = self.fly_in + else + return false + end + + for _,checknode in pairs(fly_in) do + if nod == checknode then + return true + elseif checknode == "__airlike" and def.walkable == false and + (def.liquidtype == "none" or minetest_get_item_group(nod, "fake_liquid") == 1) then + return true + end + end + + return false +end + + +-- check line of sight (BrunoMine) +local line_of_sight = function(self, pos1, pos2, stepsize) + + stepsize = stepsize or 1 + + local s, pos = minetest_line_of_sight(pos1, pos2, stepsize) + + -- normal walking and flying mobs can see you through air + if s == true then + return true + end + + -- New pos1 to be analyzed + local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} + + local r, pos = minetest_line_of_sight(npos1, pos2, stepsize) + + -- Checks the return + if r == true then return true end + + -- Nodename found + local nn = minetest_get_node(pos).name + + -- Target Distance (td) to travel + local td = vector.distance(pos1, pos2) + + -- Actual Distance (ad) traveled + local ad = 0 + + -- It continues to advance in the line of sight in search of a real + -- obstruction which counts as 'normal' nodebox. + while minetest_registered_nodes[nn] + and minetest_registered_nodes[nn].walkable == false do + + -- Check if you can still move forward + if td < ad + stepsize then + return true -- Reached the target + end + + -- Moves the analyzed pos + local d = vector.distance(pos1, pos2) + + npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x + npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y + npos1.z = ((pos2.z - pos1.z) / d * stepsize) + pos1.z + + -- NaN checks + if d == 0 + or npos1.x ~= npos1.x + or npos1.y ~= npos1.y + or npos1.z ~= npos1.z then + return false + end + + ad = ad + stepsize + + -- scan again + r, pos = minetest_line_of_sight(npos1, pos2, stepsize) + + if r == true then return true end + + -- New Nodename found + nn = minetest_get_node(pos).name + + end + + return false +end + +-- Returns true if node is a water hazard +local is_node_waterhazard = function(self, nodename) + local nn = nodename + if self.water_damage > 0 then + if minetest_get_item_group(nn, "water") ~= 0 then + return true + end + end + if minetest_registered_nodes[nn] and minetest_registered_nodes[nn].drowning and minetest_registered_nodes[nn].drowning > 0 then + if self.breath_max ~= -1 then + -- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case + -- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous + if not self.breathes_in_water and minetest_get_item_group(nn, "water") ~= 0 then + return true + end + end + end + return false +end + + +-- Returns true is node can deal damage to self +local is_node_dangerous = function(self, nodename) + local nn = nodename + if self.lava_damage > 0 then + if minetest_get_item_group(nn, "lava") ~= 0 then + return true + end + end + if self.fire_damage > 0 then + if minetest_get_item_group(nn, "fire") ~= 0 then + return true + end + end + if minetest_registered_nodes[nn] and minetest_registered_nodes[nn].damage_per_second and minetest_registered_nodes[nn].damage_per_second > 0 then + return true + end + return false +end + + +local add_texture_mod = function(self, mod) + local full_mod = "" + local already_added = false + for i=1, #self.texture_mods do + if mod == self.texture_mods[i] then + already_added = true + end + full_mod = full_mod .. self.texture_mods[i] + end + if not already_added then + full_mod = full_mod .. mod + table.insert(self.texture_mods, mod) + end + self.object:set_texture_mod(full_mod) +end + + +local remove_texture_mod = function(self, mod) + local full_mod = "" + local remove = {} + for i=1, #self.texture_mods do + if self.texture_mods[i] ~= mod then + full_mod = full_mod .. self.texture_mods[i] + else + table.insert(remove, i) + end + end + for i=#remove, 1 do + table.remove(self.texture_mods, remove[i]) + end + self.object:set_texture_mod(full_mod) +end From 54f5bee8a379bf910c1cc6ea3d33bd32b819f3dd Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 13 Apr 2021 08:08:29 -0400 Subject: [PATCH 011/176] reorganize load settings --- mods/ENTITIES/mcl_mobs/api.lua | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 3619ca3628..18285e7f28 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -62,6 +62,18 @@ MOB_CAP.passive = 10 MOB_CAP.ambient = 15 MOB_CAP.water = 15 +-- Load 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 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) + -- random locals I found local los_switcher = false @@ -96,17 +108,7 @@ local atan = function(x) end --- Load 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 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) + -- Shows helpful debug info above each mob local mobs_debug = minetest_settings:get_bool("mobs_debug", false) From f29ad4b8b78689ed0d759c18178a6b2dbc9a1e25 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 13 Apr 2021 08:20:11 -0400 Subject: [PATCH 012/176] Reorganize more settings to the top of file --- mods/ENTITIES/mcl_mobs/api.lua | 1187 +------------------------------- 1 file changed, 30 insertions(+), 1157 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 18285e7f28..9a32c394d5 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -62,7 +62,7 @@ MOB_CAP.passive = 10 MOB_CAP.ambient = 15 MOB_CAP.water = 15 --- Load settings +-- 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 @@ -74,12 +74,31 @@ 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 + +-- default nodes +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") ~= 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 + -- random locals I found -local los_switcher = false +local los_switcher = false local height_switcher = false --- Localize +-- Get translator local S = minetest.get_translator("mcl_mobs") -- CMI support check @@ -121,109 +140,6 @@ if minetest_settings:get_bool("only_peaceful_mobs", false) then end) end --- 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 - --- default nodes -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") ~= 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 - - - --- play sound -local mob_sound = function(self, soundname, is_opinion, fixed_pitch) - - local soundinfo - if self.sounds_child and self.child then - soundinfo = self.sounds_child - elseif self.sounds then - soundinfo = self.sounds - end - if not soundinfo then - return - end - local sound = soundinfo[soundname] - if sound then - if is_opinion and self.opinion_sound_cooloff > 0 then - return - end - local pitch - if not fixed_pitch then - local base_pitch = soundinfo.base_pitch - if not base_pitch then - base_pitch = 1 - end - if self.child and (not self.sounds_child) then - -- Children have higher pitch - pitch = base_pitch * 1.5 - else - pitch = base_pitch - end - -- randomize the pitch a bit - pitch = pitch + math_random(-10, 10) * 0.005 - end - minetest_sound_play(sound, { - object = self.object, - gain = 1.0, - max_hear_distance = self.sounds.distance, - pitch = pitch, - }, true) - self.opinion_sound_cooloff = 1 - end -end - --- Return true if object is in view_range -local function object_in_range(self, object) - if not object then - return false - end - local factor - -- Apply view range reduction for special player armor - if object:is_player() and mod_armor then - factor = armor:get_mob_view_range_factor(object, self.name) - end - -- Distance check - local dist - if factor and factor == 0 then - return false - elseif factor then - dist = self.view_range * factor - else - dist = self.view_range - end - - local p1, p2 = self.object:get_pos(), object:get_pos() - return p1 and p2 and (vector.distance(p1, p2) <= dist) -end - --- attack player/mob -local do_attack = function(self, player) - - if self.state == "attack" or self.state == "die" then - return - end - - self.attack = player - self.state = "attack" - - -- TODO: Implement war_cry sound without being annoying - --if math_random(0, 100) < 90 then - --mob_sound(self, "war_cry", true) - --end -end - local collision = function(self) pos = self.object:get_pos() --do collision detection from the base of the mob @@ -350,33 +266,6 @@ local get_velocity = function(self) return 0 end -local function update_roll(self) - local is_Fleckenstein = self.nametag == "Fleckenstein" - local was_Fleckenstein = false - - local rot = self.object:get_rotation() - rot.z = is_Fleckenstein and math_pi or 0 - self.object:set_rotation(rot) - - local cbox = table.copy(self.collisionbox) - local acbox = self.object:get_properties().collisionbox - - if math_abs(cbox[2] - acbox[2]) > 0.1 then - was_Fleckenstein = true - end - - if is_Fleckenstein ~= was_Fleckenstein then - local pos = self.object:get_pos() - pos.y = pos.y + (acbox[2] + acbox[5]) - self.object:set_pos(pos) - end - - if is_Fleckenstein then - cbox[2], cbox[5] = -cbox[5], -cbox[2] - end - - self.object:set_properties({collisionbox = cbox}) -end -- set and return valid yaw local set_yaw = function(self, yaw, delay, dtime) @@ -489,751 +378,14 @@ mobs.death_effect = function(pos, yaw, collisionbox, rotate) end --- check if within physical map limits (-30911 to 30927) -local within_limits, wmin, wmax = nil, -30913, 30928 -within_limits = function(pos, radius) - 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 - 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 - - --- is mob facing a cliff or danger -local is_at_cliff_or_danger = function(self) - - if self.fear_height == 0 then -- 0 for no falling protection! - return false - end - - if not self.object:get_luaentity() then - return false - end - local yaw = self.object:get_yaw() - local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) - local pos = self.object:get_pos() - local ypos = pos.y + self.collisionbox[2] -- just above floor - - local free_fall, blocker = minetest_line_of_sight( - {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, - {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) - if free_fall then - return true - else - local bnode = minetest_get_node(blocker) - local danger = is_node_dangerous(self, bnode.name) - if danger then - return true - else - local def = minetest_registered_nodes[bnode.name] - if def and def.walkable then - return false - end - end - end - - return false -end - - --- copy the 'mob facing cliff_or_danger check' from above, and rework to avoid water -local is_at_water_danger = function(self) - - - if not self.object:get_luaentity() then - return false - end - local yaw = self.object:get_yaw() - local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) - local pos = self.object:get_pos() - local ypos = pos.y + self.collisionbox[2] -- just above floor - - local free_fall, blocker = minetest_line_of_sight( - {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, - {x = pos.x + dir_x, y = ypos - 3, z = pos.z + dir_z}) - if free_fall then - return true - else - local bnode = minetest_get_node(blocker) - local waterdanger = is_node_waterhazard(self, bnode.name) - if - waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) then - return false - elseif waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) == false then - return true - else - local def = minetest_registered_nodes[bnode.name] - if def and def.walkable then - return false - end - end - end - - return false -end - - --- get node but use fallback for nil or unknown -local node_ok = function(pos, fallback) - - fallback = fallback or mobs.fallback_node - - local node = minetest_get_node_or_nil(pos) - - if node and minetest_registered_nodes[node.name] then - return node - end - - return minetest_registered_nodes[fallback] -end - - --- environmental damage (water, lava, fire, light etc.) -local do_env_damage = function(self) - - -- feed/tame text timer (so mob 'full' messages dont spam chat) - if self.htimer > 0 then - self.htimer = self.htimer - 1 - end - - -- reset nametag after showing health stats - if self.htimer < 1 and self.nametag2 then - - self.nametag = self.nametag2 - self.nametag2 = nil - - update_tag(self) - end - - local pos = self.object:get_pos() - - self.time_of_day = minetest.get_timeofday() - - -- remove mob if beyond map limits - if not within_limits(pos, 0) then - mcl_burning.extinguish(self.object) - self.object:remove() - return true - end - - - -- Deal light damage to mob, returns true if mob died - local deal_light_damage = function(self, pos, damage) - if not (mod_weather and (mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then - self.health = self.health - damage - - effect(pos, 5, "mcl_particles_smoke.png") - - if check_for_death(self, "light", {type = "light"}) then - return true - end - end - end - - -- Use get_node_light for Minetest version 5.3 where get_natural_light - -- does not exist yet. - local get_light = minetest_get_natural_light or minetest_get_node_light - local sunlight = get_light(pos, self.time_of_day) - - -- bright light harms mob - if self.light_damage ~= 0 and (sunlight or 0) > 12 then - if deal_light_damage(self, pos, self.light_damage) then - return true - end - end - local _, dim = nil, "overworld" - if mod_worlds then - _, dim = mcl_worlds.y_to_layer(pos.y) - end - if (self.sunlight_damage ~= 0 or self.ignited_by_sunlight) and (sunlight or 0) >= minetest.LIGHT_MAX and dim == "overworld" then - if self.ignited_by_sunlight then - mcl_burning.set_on_fire(self.object, 10) - else - deal_light_damage(self, pos, self.sunlight_damage) - return true - end - end - - local y_level = self.collisionbox[2] - - if self.child then - y_level = self.collisionbox[2] * 0.5 - end - - -- what is mob standing in? - pos.y = pos.y + y_level + 0.25 -- foot level - local pos2 = {x=pos.x, y=pos.y-1, z=pos.z} - self.standing_in = node_ok(pos, "air").name - self.standing_on = node_ok(pos2, "air").name - - -- don't fall when on ignore, just stand still - if self.standing_in == "ignore" then - self.object:set_velocity({x = 0, y = 0, z = 0}) - end - - local nodef = minetest_registered_nodes[self.standing_in] - - -- rain - if self.rain_damage > 0 and mod_weather then - if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then - - self.health = self.health - self.rain_damage - - if check_for_death(self, "rain", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - end - - pos.y = pos.y + 1 -- for particle effect position - - -- water damage - if self.water_damage > 0 - and nodef.groups.water then - - if self.water_damage ~= 0 then - - self.health = self.health - self.water_damage - - effect(pos, 5, "mcl_particles_smoke.png", nil, nil, 1, nil) - - if check_for_death(self, "water", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - - -- lava damage - elseif self.lava_damage > 0 - and (nodef.groups.lava) then - - if self.lava_damage ~= 0 then - - self.health = self.health - self.lava_damage - - effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) - - if check_for_death(self, "lava", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - - -- fire damage - elseif self.fire_damage > 0 - and (nodef.groups.fire) then - - if self.fire_damage ~= 0 then - - self.health = self.health - self.fire_damage - - effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) - - if check_for_death(self, "fire", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - - -- damage_per_second node check - elseif nodef.damage_per_second ~= 0 and not nodef.groups.lava and not nodef.groups.fire then - - self.health = self.health - nodef.damage_per_second - - effect(pos, 5, "mcl_particles_smoke.png") - - if check_for_death(self, "dps", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - - -- Drowning damage - if self.breath_max ~= -1 then - local drowning = false - if self.breathes_in_water then - if minetest_get_item_group(self.standing_in, "water") == 0 then - drowning = true - end - elseif nodef.drowning > 0 then - drowning = true - end - if drowning then - - self.breath = math_max(0, self.breath - 1) - - effect(pos, 2, "bubble.png", nil, nil, 1, nil) - if self.breath <= 0 then - local dmg - if nodef.drowning > 0 then - dmg = nodef.drowning - else - dmg = 4 - end - damage_effect(self, dmg) - self.health = self.health - dmg - end - if check_for_death(self, "drowning", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - else - self.breath = math_min(self.breath_max, self.breath + 1) - end - end - - --- suffocation inside solid node - -- FIXME: Redundant with mcl_playerplus - if (self.suffocation == true) - and (nodef.walkable == nil or nodef.walkable == true) - and (nodef.collision_box == nil or nodef.collision_box.type == "regular") - and (nodef.node_box == nil or nodef.node_box.type == "regular") - and (nodef.groups.disable_suffocation ~= 1) - and (nodef.groups.opaque == 1) then - - -- Short grace period before starting to take suffocation damage. - -- This is different from players, who take damage instantly. - -- This has been done because mobs might briefly be inside solid nodes - -- when e.g. climbing up stairs. - -- This is a bit hacky because it assumes that do_env_damage - -- is called roughly every second only. - self.suffocation_timer = self.suffocation_timer + 1 - if self.suffocation_timer >= 3 then - -- 2 damage per second - -- TODO: Deal this damage once every 1/2 second - self.health = self.health - 2 - - if check_for_death(self, "suffocation", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - else - self.suffocation_timer = 0 - end - - return check_for_death(self, "", {type = "unknown"}) -end - - --- jump if facing a solid node (not fences or gates) -local do_jump = function(self) - - if not self.jump - or self.jump_height == 0 - or self.fly - or (self.child and self.type ~= "monster") - or self.order == "stand" then - return false - end - - self.facing_fence = false - - -- something stopping us while moving? - if self.state ~= "stand" - and get_velocity(self) > 0.5 - and self.object:get_velocity().y ~= 0 then - return false - end - - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() - - -- what is mob standing on? - pos.y = pos.y + self.collisionbox[2] - 0.2 - - local nod = node_ok(pos) - - if minetest_registered_nodes[nod.name].walkable == false then - return false - end - - -- where is front - local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) - - -- what is in front of mob? - nod = node_ok({ - x = pos.x + dir_x, - y = pos.y + 0.5, - z = pos.z + dir_z - }) - - -- this is used to detect if there's a block on top of the block in front of the mob. - -- If there is, there is no point in jumping as we won't manage. - local nodTop = node_ok({ - x = pos.x + dir_x, - y = pos.y + 1.5, - z = pos.z + dir_z - }, "air") - - -- we don't attempt to jump if there's a stack of blocks blocking - if minetest_registered_nodes[nodTop.name].walkable == true then - return false - end - - -- thin blocks that do not need to be jumped - if nod.name == node_snow then - return false - end - - if self.walk_chance == 0 - or minetest_registered_items[nod.name].walkable then - - if minetest_get_item_group(nod.name, "fence") == 0 - and minetest_get_item_group(nod.name, "fence_gate") == 0 - and minetest_get_item_group(nod.name, "wall") == 0 then - - local v = self.object:get_velocity() - - v.y = self.jump_height - - set_animation(self, "jump") -- only when defined - - self.object:set_velocity(v) - - -- when in air move forward - minetest_after(0.3, function(self, v) - if (not self.object) or (not self.object:get_luaentity()) or (self.state == "die") then - return - end - self.object:set_acceleration({ - x = v.x * 2, - y = -10, - z = v.z * 2, - }) - end, self, v) - - if self.jump_sound_cooloff <= 0 then - mob_sound(self, "jump") - self.jump_sound_cooloff = 0.5 - end - else - self.facing_fence = true - end - - -- if we jumped against a block/wall 4 times then turn - if self.object:get_velocity().x ~= 0 - and self.object:get_velocity().z ~= 0 then - - self.jump_count = (self.jump_count or 0) + 1 - - if self.jump_count == 4 then - - local yaw = self.object:get_yaw() or 0 - - yaw = set_yaw(self, yaw + 1.35, 8) - - self.jump_count = 0 - end - end - - return true - end - - return false -end - - --- blast damage to entities nearby -local entity_physics = function(pos, radius) - - radius = radius * 2 - - local objs = minetest_get_objects_inside_radius(pos, radius) - local obj_pos, dist - - for n = 1, #objs do - - obj_pos = objs[n]:get_pos() - - dist = vector.distance(pos, obj_pos) - if dist < 1 then dist = 1 end - - local damage = math_floor((4 / dist) * radius) - local ent = objs[n]:get_luaentity() - - -- punches work on entities AND players - objs[n]:punch(objs[n], 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, pos) - end -end - - --- should mob follow what I'm holding ? -local follow_holding = function(self, clicker) - - if mobs.invis[clicker:get_player_name()] then - return false - end - - local item = clicker:get_wielded_item() - local t = type(self.follow) - - -- single item - if t == "string" - and item:get_name() == self.follow then - return true - - -- multiple items - elseif t == "table" then - - for no = 1, #self.follow do - - if self.follow[no] == item:get_name() then - return true - end - end - end - - return false -end - - --- find two animals of same type and breed if nearby and horny -local breed = function(self) - - -- child takes a long time before growing into adult - if self.child == true then - - -- When a child, hornytimer is used to count age until adulthood - self.hornytimer = self.hornytimer + 1 - - if self.hornytimer >= CHILD_GROW_TIME then - - self.child = false - self.hornytimer = 0 - - self.object:set_properties({ - textures = self.base_texture, - mesh = self.base_mesh, - visual_size = self.base_size, - collisionbox = self.base_colbox, - selectionbox = self.base_selbox, - }) - - -- custom function when child grows up - if self.on_grown then - self.on_grown(self) - else - -- jump when fully grown so as not to fall into ground - self.object:set_velocity({ - x = 0, - y = self.jump_height, - z = 0 - }) - end - end - - return - end - - -- horny animal can mate for BREED_TIME seconds, - -- afterwards horny animal cannot mate again for BREED_TIME_AGAIN seconds - if self.horny == true - and self.hornytimer < BREED_TIME + BREED_TIME_AGAIN then - - self.hornytimer = self.hornytimer + 1 - - if self.hornytimer >= BREED_TIME + BREED_TIME_AGAIN then - self.hornytimer = 0 - self.horny = false - end - end - - -- find another same animal who is also horny and mate if nearby - if self.horny == true - and self.hornytimer <= BREED_TIME then - - local pos = self.object:get_pos() - - effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) - - local objs = minetest_get_objects_inside_radius(pos, 3) - local num = 0 - local ent = nil - - for n = 1, #objs do - - ent = objs[n]:get_luaentity() - - -- check for same animal with different colour - local canmate = false - - if ent then - - if ent.name == self.name then - canmate = true - else - local entname = string.split(ent.name,":") - local selfname = string.split(self.name,":") - - if entname[1] == selfname[1] then - entname = string.split(entname[2],"_") - selfname = string.split(selfname[2],"_") - - if entname[1] == selfname[1] then - canmate = true - end - end - end - end - - if ent - and canmate == true - and ent.horny == true - and ent.hornytimer <= BREED_TIME then - num = num + 1 - end - - -- found your mate? then have a baby - if num > 1 then - - self.hornytimer = BREED_TIME + 1 - ent.hornytimer = BREED_TIME + 1 - - -- spawn baby - minetest_after(5, function(parent1, parent2, pos) - if not parent1.object:get_luaentity() then - return - end - if not parent2.object:get_luaentity() then - return - end - - -- Give XP - if mod_experience then - mcl_experience.throw_experience(pos, math_random(1, 7)) - end - - -- custom breed function - if parent1.on_breed then - -- when false, skip going any further - if parent1.on_breed(parent1, parent2) == false then - return - end - end - - local child = mobs:spawn_child(pos, parent1.name) - - local ent_c = child:get_luaentity() - - - -- Use texture of one of the parents - local p = math_random(1, 2) - if p == 1 then - ent_c.base_texture = parent1.base_texture - else - ent_c.base_texture = parent2.base_texture - end - child:set_properties({ - textures = ent_c.base_texture - }) - - -- tamed and owned by parents' owner - ent_c.tamed = true - ent_c.owner = parent1.owner - end, self, ent, pos) - - num = 0 - - break - end - end - end -end - - --- find and replace what mob is looking for (grass, wheat etc.) -local replace = function(self, pos) - - if not self.replace_rate - 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 - return - end - - local what, with, y_offset - - if type(self.replace_what[1]) == "table" then - - local num = math_random(#self.replace_what) - - what = self.replace_what[num][1] or "" - with = self.replace_what[num][2] or "" - y_offset = self.replace_what[num][3] or 0 - else - what = self.replace_what - with = self.replace_with or "" - y_offset = self.replace_offset or 0 - end - - pos.y = pos.y + y_offset - - local node = minetest_get_node(pos) - if node.name == what then - - local oldnode = {name = what, param2 = node.param2} - local newnode = {name = with, param2 = node.param2} - local on_replace_return - - if self.on_replace then - on_replace_return = self.on_replace(self, pos, oldnode, newnode) - end - - if on_replace_return ~= false then - - if mobs_griefing then - minetest_set_node(pos, newnode) - end - - end - end -end - - --- check if daytime and also if mob is docile during daylight hours -local day_docile = function(self) - - if self.docile_by_day == false then - - return false - - elseif self.docile_by_day == true - and self.time_of_day > 0.2 - and self.time_of_day < 0.8 then - - return true - end -end - - - - -- execute current state (stand, walk, run, attacks) -- returns true if mob has died local do_states = function(self, dtime) local yaw = self.object:get_yaw() or 0 + --[[ + if self.state == "stand" then if math_random(1, 4) == 1 then @@ -1785,290 +937,10 @@ local do_states = function(self, dtime) end end end + ]]-- end --- deal damage and effects when mob punched -local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) - -- custom punch function - if self.do_punch then - - -- when false skip going any further - if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then - return - end - end - - -- error checking when mod profiling is enabled - if not tool_capabilities then - minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") - return - end - - local is_player = hitter:is_player() - - if is_player then - -- is mob protected? - if self.protected and minetest_is_protected(self.object:get_pos(), hitter:get_player_name()) then - return - end - - -- set/update 'drop xp' timestamp if hitted by player - self.xp_timestamp = minetest_get_us_time() - end - - - -- punch interval - local weapon = hitter:get_wielded_item() - local punch_interval = 1.4 - - -- exhaust attacker - if mod_hunger and is_player then - mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK) - end - - -- calculate mob damage - local damage = 0 - local armor = self.object:get_armor_groups() or {} - local tmp - - -- quick error check incase it ends up 0 (serialize.h check test) - if tflp == 0 then - tflp = 0.2 - end - - if use_cmi then - damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) - else - - for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do - - tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) - - if tmp < 0 then - tmp = 0.0 - elseif tmp > 1 then - tmp = 1.0 - end - - damage = damage + (tool_capabilities.damage_groups[group] or 0) - * tmp * ((armor[group] or 0) / 100.0) - end - end - - if weapon then - local fire_aspect_level = mcl_enchanting.get_enchantment(weapon, "fire_aspect") - if fire_aspect_level > 0 then - mcl_burning.set_on_fire(self.object, fire_aspect_level * 4) - end - end - - -- check for tool immunity or special damage - for n = 1, #self.immune_to do - - if self.immune_to[n][1] == weapon:get_name() then - - damage = self.immune_to[n][2] or 0 - break - end - end - - -- healing - if damage <= -1 then - self.health = self.health - math_floor(damage) - return - end - - if use_cmi then - - local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) - - if cancel then return end - 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) - if minetest_is_creative_enabled("") ~= true - and tool_capabilities then - if tool_capabilities.punch_attack_uses then - -- Without this delay, the wear does not work. Quite hacky ... - minetest_after(0, function(name) - local player = minetest.get_player_by_name(name) - if not player then return end - 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) - weapon:add_wear(wear) - hitter:set_wielded_item(weapon) - end - end, hitter:get_player_name()) - end - end - - local die = false - - -- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately. - if damage >= 0.1 then - - -- weapon sounds - if weapon:get_definition().sounds ~= nil then - - local s = math_random(0, #weapon:get_definition().sounds) - - minetest_sound_play(weapon:get_definition().sounds[s], { - object = self.object, --hitter, - max_hear_distance = 8 - }, true) - else - minetest_sound_play("default_punch", { - object = self.object, - max_hear_distance = 5 - }, true) - end - - damage_effect(self, damage) - - -- do damage - self.health = self.health - damage - - -- skip future functions if dead, except alerting others - if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then - die = true - end - - -- knock back effect (only on full punch) - if not die - and self.knock_back - and tflp >= punch_interval then - - local v = self.object:get_velocity() - local r = 1.4 - math_min(punch_interval, 1.4) - local kb = r * 2.0 - local up = 2 - - -- if already in air then dont go up anymore when hit - if v.y ~= 0 - or self.fly then - up = 0 - end - - -- direction error check - dir = dir or {x = 0, y = 0, z = 0} - - -- check if tool already has specific knockback value - if tool_capabilities.damage_groups["knockback"] then - kb = tool_capabilities.damage_groups["knockback"] - else - kb = kb * 1.5 - end - - - local luaentity - if hitter then - luaentity = hitter:get_luaentity() - end - if hitter and is_player then - local wielditem = hitter:get_wielded_item() - kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") - elseif luaentity and luaentity._knockback then - kb = kb + luaentity._knockback - end - - self.object:set_velocity({ - x = dir.x * kb, - y = dir.y * kb + up * 2, - z = dir.z * kb - }) - - self.pause_timer = 0.25 - end - end -- END if damage - - -- if skittish then run away - if not die and self.runaway == true and self.state ~= "flop" then - - local lp = hitter:get_pos() - local s = self.object:get_pos() - local vec = { - x = lp.x - s.x, - y = lp.y - s.y, - z = lp.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + 3 * math_pi / 2) - self.rotate - - if lp.x > s.x then - yaw = yaw + math_pi - end - - yaw = set_yaw(self, yaw, 6) - self.state = "runaway" - self.runaway_timer = 0 - self.following = nil - end - - local name = hitter:get_player_name() or "" - - -- attack puncher and call other mobs for help - if self.passive == false - and self.state ~= "flop" - and (self.child == false or self.type == "monster") - and hitter:get_player_name() ~= self.owner - and not mobs.invis[ name ] then - - if not die then - -- attack whoever punched mob - self.state = "" - do_attack(self, hitter) - end - - -- alert others to the attack - local objs = minetest_get_objects_inside_radius(hitter:get_pos(), self.view_range) - local obj = nil - - for n = 1, #objs do - - obj = objs[n]:get_luaentity() - - if obj then - - -- only alert members of same mob or friends - if obj.group_attack - and obj.state ~= "attack" - and obj.owner ~= name then - if obj.name == self.name then - do_attack(obj, hitter) - elseif type(obj.group_attack) == "table" then - for i=1, #obj.group_attack do - if obj.name == obj.group_attack[i] then - do_attack(obj, hitter) - break - end - end - end - end - - -- have owned mobs attack player threat - if obj.owner == name and obj.owner_loyal then - do_attack(obj, self.object) - end - end - end - end -end - -local mob_detach_child = function(self, child) - - if self.driver == child then - self.driver = nil - end - -end -- get entity staticdata local mob_staticdata = function(self) @@ -2260,8 +1132,9 @@ local mob_activate = function(self, staticdata, def, dtime) -- set anything changed above self.object:set_properties(self) set_yaw(self, (math_random(0, 360) - 180) / 180 * math_pi, 6) - update_tag(self) - set_animation(self, "stand") + + --update_tag(self) + --set_animation(self, "stand") -- run on_spawn function if found if self.on_spawn and not self.on_spawn_run then @@ -2370,7 +1243,7 @@ local mob_step = function(self, dtime) yaw = yaw + (math_random() * 2 - 1) * 5 * dtime end self.object:set_yaw(yaw) - update_roll(self) + --update_roll(self) end -- end rotation @@ -2974,7 +1847,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) end if pos - and within_limits(pos, 0) + --and within_limits(pos, 0) and not minetest_is_protected(pos, placer:get_player_name()) then local name = placer:get_player_name() From 9758bbf2e7e382948b4ad1ab8c360519270fec14 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 13 Apr 2021 08:21:04 -0400 Subject: [PATCH 013/176] Finish gutting mob api --- mods/ENTITIES/mcl_mobs/backup_code_api.lua | 1130 ++++++++++++++++++++ 1 file changed, 1130 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/backup_code_api.lua index ba4b8452af..85cf0db5f0 100644 --- a/mods/ENTITIES/mcl_mobs/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/backup_code_api.lua @@ -1464,3 +1464,1133 @@ local remove_texture_mod = function(self, mod) end self.object:set_texture_mod(full_mod) end + + +-- Return true if object is in view_range +local function object_in_range(self, object) + if not object then + return false + end + local factor + -- Apply view range reduction for special player armor + if object:is_player() and mod_armor then + factor = armor:get_mob_view_range_factor(object, self.name) + end + -- Distance check + local dist + if factor and factor == 0 then + return false + elseif factor then + dist = self.view_range * factor + else + dist = self.view_range + end + + local p1, p2 = self.object:get_pos(), object:get_pos() + return p1 and p2 and (vector.distance(p1, p2) <= dist) +end + +-- attack player/mob +local do_attack = function(self, player) + + if self.state == "attack" or self.state == "die" then + return + end + + self.attack = player + self.state = "attack" + + -- TODO: Implement war_cry sound without being annoying + --if math_random(0, 100) < 90 then + --mob_sound(self, "war_cry", true) + --end +end + + +-- play sound +local mob_sound = function(self, soundname, is_opinion, fixed_pitch) + local soundinfo + if self.sounds_child and self.child then + soundinfo = self.sounds_child + elseif self.sounds then + soundinfo = self.sounds + end + if not soundinfo then + return + end + local sound = soundinfo[soundname] + if sound then + if is_opinion and self.opinion_sound_cooloff > 0 then + return + end + local pitch + if not fixed_pitch then + local base_pitch = soundinfo.base_pitch + if not base_pitch then + base_pitch = 1 + end + if self.child and (not self.sounds_child) then + -- Children have higher pitch + pitch = base_pitch * 1.5 + else + pitch = base_pitch + end + -- randomize the pitch a bit + pitch = pitch + math_random(-10, 10) * 0.005 + end + minetest_sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = self.sounds.distance, + pitch = pitch, + }, true) + self.opinion_sound_cooloff = 1 + end +end + + +local function update_roll(self) + local is_Fleckenstein = self.nametag == "Fleckenstein" + local was_Fleckenstein = false + + local rot = self.object:get_rotation() + rot.z = is_Fleckenstein and math_pi or 0 + self.object:set_rotation(rot) + + local cbox = table.copy(self.collisionbox) + local acbox = self.object:get_properties().collisionbox + + if math_abs(cbox[2] - acbox[2]) > 0.1 then + was_Fleckenstein = true + end + + if is_Fleckenstein ~= was_Fleckenstein then + local pos = self.object:get_pos() + pos.y = pos.y + (acbox[2] + acbox[5]) + self.object:set_pos(pos) + end + + if is_Fleckenstein then + cbox[2], cbox[5] = -cbox[5], -cbox[2] + end + + self.object:set_properties({collisionbox = cbox}) +end + +-- check if within physical map limits (-30911 to 30927) +local within_limits, wmin, wmax = nil, -30913, 30928 +within_limits = function(pos, radius) + 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 + 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 + +-- is mob facing a cliff or danger +local is_at_cliff_or_danger = function(self) + + if self.fear_height == 0 then -- 0 for no falling protection! + return false + end + + if not self.object:get_luaentity() then + return false + end + local yaw = self.object:get_yaw() + local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) + local pos = self.object:get_pos() + local ypos = pos.y + self.collisionbox[2] -- just above floor + + local free_fall, blocker = minetest_line_of_sight( + {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, + {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) + if free_fall then + return true + else + local bnode = minetest_get_node(blocker) + local danger = is_node_dangerous(self, bnode.name) + if danger then + return true + else + local def = minetest_registered_nodes[bnode.name] + if def and def.walkable then + return false + end + end + end + + return false +end + + +-- copy the 'mob facing cliff_or_danger check' from above, and rework to avoid water +local is_at_water_danger = function(self) + + + if not self.object:get_luaentity() then + return false + end + local yaw = self.object:get_yaw() + local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) + local pos = self.object:get_pos() + local ypos = pos.y + self.collisionbox[2] -- just above floor + + local free_fall, blocker = minetest_line_of_sight( + {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, + {x = pos.x + dir_x, y = ypos - 3, z = pos.z + dir_z}) + if free_fall then + return true + else + local bnode = minetest_get_node(blocker) + local waterdanger = is_node_waterhazard(self, bnode.name) + if + waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) then + return false + elseif waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) == false then + return true + else + local def = minetest_registered_nodes[bnode.name] + if def and def.walkable then + return false + end + end + end + + return false +end + + +-- get node but use fallback for nil or unknown +local node_ok = function(pos, fallback) + + fallback = fallback or mobs.fallback_node + + local node = minetest_get_node_or_nil(pos) + + if node and minetest_registered_nodes[node.name] then + return node + end + + return minetest_registered_nodes[fallback] +end + + +-- environmental damage (water, lava, fire, light etc.) +local do_env_damage = function(self) + + -- feed/tame text timer (so mob 'full' messages dont spam chat) + if self.htimer > 0 then + self.htimer = self.htimer - 1 + end + + -- reset nametag after showing health stats + if self.htimer < 1 and self.nametag2 then + + self.nametag = self.nametag2 + self.nametag2 = nil + + update_tag(self) + end + + local pos = self.object:get_pos() + + self.time_of_day = minetest.get_timeofday() + + -- remove mob if beyond map limits + if not within_limits(pos, 0) then + mcl_burning.extinguish(self.object) + self.object:remove() + return true + end + + + -- Deal light damage to mob, returns true if mob died + local deal_light_damage = function(self, pos, damage) + if not (mod_weather and (mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then + self.health = self.health - damage + + effect(pos, 5, "mcl_particles_smoke.png") + + if check_for_death(self, "light", {type = "light"}) then + return true + end + end + end + + -- Use get_node_light for Minetest version 5.3 where get_natural_light + -- does not exist yet. + local get_light = minetest_get_natural_light or minetest_get_node_light + local sunlight = get_light(pos, self.time_of_day) + + -- bright light harms mob + if self.light_damage ~= 0 and (sunlight or 0) > 12 then + if deal_light_damage(self, pos, self.light_damage) then + return true + end + end + local _, dim = nil, "overworld" + if mod_worlds then + _, dim = mcl_worlds.y_to_layer(pos.y) + end + if (self.sunlight_damage ~= 0 or self.ignited_by_sunlight) and (sunlight or 0) >= minetest.LIGHT_MAX and dim == "overworld" then + if self.ignited_by_sunlight then + mcl_burning.set_on_fire(self.object, 10) + else + deal_light_damage(self, pos, self.sunlight_damage) + return true + end + end + + local y_level = self.collisionbox[2] + + if self.child then + y_level = self.collisionbox[2] * 0.5 + end + + -- what is mob standing in? + pos.y = pos.y + y_level + 0.25 -- foot level + local pos2 = {x=pos.x, y=pos.y-1, z=pos.z} + self.standing_in = node_ok(pos, "air").name + self.standing_on = node_ok(pos2, "air").name + + -- don't fall when on ignore, just stand still + if self.standing_in == "ignore" then + self.object:set_velocity({x = 0, y = 0, z = 0}) + end + + local nodef = minetest_registered_nodes[self.standing_in] + + -- rain + if self.rain_damage > 0 and mod_weather then + if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then + + self.health = self.health - self.rain_damage + + if check_for_death(self, "rain", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + end + + pos.y = pos.y + 1 -- for particle effect position + + -- water damage + if self.water_damage > 0 + and nodef.groups.water then + + if self.water_damage ~= 0 then + + self.health = self.health - self.water_damage + + effect(pos, 5, "mcl_particles_smoke.png", nil, nil, 1, nil) + + if check_for_death(self, "water", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + + -- lava damage + elseif self.lava_damage > 0 + and (nodef.groups.lava) then + + if self.lava_damage ~= 0 then + + self.health = self.health - self.lava_damage + + effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) + + if check_for_death(self, "lava", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + + -- fire damage + elseif self.fire_damage > 0 + and (nodef.groups.fire) then + + if self.fire_damage ~= 0 then + + self.health = self.health - self.fire_damage + + effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) + + if check_for_death(self, "fire", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + + -- damage_per_second node check + elseif nodef.damage_per_second ~= 0 and not nodef.groups.lava and not nodef.groups.fire then + + self.health = self.health - nodef.damage_per_second + + effect(pos, 5, "mcl_particles_smoke.png") + + if check_for_death(self, "dps", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + + -- Drowning damage + if self.breath_max ~= -1 then + local drowning = false + if self.breathes_in_water then + if minetest_get_item_group(self.standing_in, "water") == 0 then + drowning = true + end + elseif nodef.drowning > 0 then + drowning = true + end + if drowning then + + self.breath = math_max(0, self.breath - 1) + + effect(pos, 2, "bubble.png", nil, nil, 1, nil) + if self.breath <= 0 then + local dmg + if nodef.drowning > 0 then + dmg = nodef.drowning + else + dmg = 4 + end + damage_effect(self, dmg) + self.health = self.health - dmg + end + if check_for_death(self, "drowning", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + else + self.breath = math_min(self.breath_max, self.breath + 1) + end + end + + --- suffocation inside solid node + -- FIXME: Redundant with mcl_playerplus + if (self.suffocation == true) + and (nodef.walkable == nil or nodef.walkable == true) + and (nodef.collision_box == nil or nodef.collision_box.type == "regular") + and (nodef.node_box == nil or nodef.node_box.type == "regular") + and (nodef.groups.disable_suffocation ~= 1) + and (nodef.groups.opaque == 1) then + + -- Short grace period before starting to take suffocation damage. + -- This is different from players, who take damage instantly. + -- This has been done because mobs might briefly be inside solid nodes + -- when e.g. climbing up stairs. + -- This is a bit hacky because it assumes that do_env_damage + -- is called roughly every second only. + self.suffocation_timer = self.suffocation_timer + 1 + if self.suffocation_timer >= 3 then + -- 2 damage per second + -- TODO: Deal this damage once every 1/2 second + self.health = self.health - 2 + + if check_for_death(self, "suffocation", {type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + else + self.suffocation_timer = 0 + end + + return check_for_death(self, "", {type = "unknown"}) +end + + +-- jump if facing a solid node (not fences or gates) +local do_jump = function(self) + + if not self.jump + or self.jump_height == 0 + or self.fly + or (self.child and self.type ~= "monster") + or self.order == "stand" then + return false + end + + self.facing_fence = false + + -- something stopping us while moving? + if self.state ~= "stand" + and get_velocity(self) > 0.5 + and self.object:get_velocity().y ~= 0 then + return false + end + + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() + + -- what is mob standing on? + pos.y = pos.y + self.collisionbox[2] - 0.2 + + local nod = node_ok(pos) + + if minetest_registered_nodes[nod.name].walkable == false then + return false + end + + -- where is front + local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) + + -- what is in front of mob? + nod = node_ok({ + x = pos.x + dir_x, + y = pos.y + 0.5, + z = pos.z + dir_z + }) + + -- this is used to detect if there's a block on top of the block in front of the mob. + -- If there is, there is no point in jumping as we won't manage. + local nodTop = node_ok({ + x = pos.x + dir_x, + y = pos.y + 1.5, + z = pos.z + dir_z + }, "air") + + -- we don't attempt to jump if there's a stack of blocks blocking + if minetest_registered_nodes[nodTop.name].walkable == true then + return false + end + + -- thin blocks that do not need to be jumped + if nod.name == node_snow then + return false + end + + if self.walk_chance == 0 + or minetest_registered_items[nod.name].walkable then + + if minetest_get_item_group(nod.name, "fence") == 0 + and minetest_get_item_group(nod.name, "fence_gate") == 0 + and minetest_get_item_group(nod.name, "wall") == 0 then + + local v = self.object:get_velocity() + + v.y = self.jump_height + + set_animation(self, "jump") -- only when defined + + self.object:set_velocity(v) + + -- when in air move forward + minetest_after(0.3, function(self, v) + if (not self.object) or (not self.object:get_luaentity()) or (self.state == "die") then + return + end + self.object:set_acceleration({ + x = v.x * 2, + y = -10, + z = v.z * 2, + }) + end, self, v) + + if self.jump_sound_cooloff <= 0 then + mob_sound(self, "jump") + self.jump_sound_cooloff = 0.5 + end + else + self.facing_fence = true + end + + -- if we jumped against a block/wall 4 times then turn + if self.object:get_velocity().x ~= 0 + and self.object:get_velocity().z ~= 0 then + + self.jump_count = (self.jump_count or 0) + 1 + + if self.jump_count == 4 then + + local yaw = self.object:get_yaw() or 0 + + yaw = set_yaw(self, yaw + 1.35, 8) + + self.jump_count = 0 + end + end + + return true + end + + return false +end + + +-- blast damage to entities nearby +local entity_physics = function(pos, radius) + + radius = radius * 2 + + local objs = minetest_get_objects_inside_radius(pos, radius) + local obj_pos, dist + + for n = 1, #objs do + + obj_pos = objs[n]:get_pos() + + dist = vector.distance(pos, obj_pos) + if dist < 1 then dist = 1 end + + local damage = math_floor((4 / dist) * radius) + local ent = objs[n]:get_luaentity() + + -- punches work on entities AND players + objs[n]:punch(objs[n], 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, pos) + end +end + + +-- should mob follow what I'm holding ? +local follow_holding = function(self, clicker) + + if mobs.invis[clicker:get_player_name()] then + return false + end + + local item = clicker:get_wielded_item() + local t = type(self.follow) + + -- single item + if t == "string" + and item:get_name() == self.follow then + return true + + -- multiple items + elseif t == "table" then + + for no = 1, #self.follow do + + if self.follow[no] == item:get_name() then + return true + end + end + end + + return false +end + + +-- find two animals of same type and breed if nearby and horny +local breed = function(self) + + -- child takes a long time before growing into adult + if self.child == true then + + -- When a child, hornytimer is used to count age until adulthood + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer >= CHILD_GROW_TIME then + + self.child = false + self.hornytimer = 0 + + self.object:set_properties({ + textures = self.base_texture, + mesh = self.base_mesh, + visual_size = self.base_size, + collisionbox = self.base_colbox, + selectionbox = self.base_selbox, + }) + + -- custom function when child grows up + if self.on_grown then + self.on_grown(self) + else + -- jump when fully grown so as not to fall into ground + self.object:set_velocity({ + x = 0, + y = self.jump_height, + z = 0 + }) + end + end + + return + end + + -- horny animal can mate for BREED_TIME seconds, + -- afterwards horny animal cannot mate again for BREED_TIME_AGAIN seconds + if self.horny == true + and self.hornytimer < BREED_TIME + BREED_TIME_AGAIN then + + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer >= BREED_TIME + BREED_TIME_AGAIN then + self.hornytimer = 0 + self.horny = false + end + end + + -- find another same animal who is also horny and mate if nearby + if self.horny == true + and self.hornytimer <= BREED_TIME then + + local pos = self.object:get_pos() + + effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) + + local objs = minetest_get_objects_inside_radius(pos, 3) + local num = 0 + local ent = nil + + for n = 1, #objs do + + ent = objs[n]:get_luaentity() + + -- check for same animal with different colour + local canmate = false + + if ent then + + if ent.name == self.name then + canmate = true + else + local entname = string.split(ent.name,":") + local selfname = string.split(self.name,":") + + if entname[1] == selfname[1] then + entname = string.split(entname[2],"_") + selfname = string.split(selfname[2],"_") + + if entname[1] == selfname[1] then + canmate = true + end + end + end + end + + if ent + and canmate == true + and ent.horny == true + and ent.hornytimer <= BREED_TIME then + num = num + 1 + end + + -- found your mate? then have a baby + if num > 1 then + + self.hornytimer = BREED_TIME + 1 + ent.hornytimer = BREED_TIME + 1 + + -- spawn baby + minetest_after(5, function(parent1, parent2, pos) + if not parent1.object:get_luaentity() then + return + end + if not parent2.object:get_luaentity() then + return + end + + -- Give XP + if mod_experience then + mcl_experience.throw_experience(pos, math_random(1, 7)) + end + + -- custom breed function + if parent1.on_breed then + -- when false, skip going any further + if parent1.on_breed(parent1, parent2) == false then + return + end + end + + local child = mobs:spawn_child(pos, parent1.name) + + local ent_c = child:get_luaentity() + + + -- Use texture of one of the parents + local p = math_random(1, 2) + if p == 1 then + ent_c.base_texture = parent1.base_texture + else + ent_c.base_texture = parent2.base_texture + end + child:set_properties({ + textures = ent_c.base_texture + }) + + -- tamed and owned by parents' owner + ent_c.tamed = true + ent_c.owner = parent1.owner + end, self, ent, pos) + + num = 0 + + break + end + end + end +end + +-- find and replace what mob is looking for (grass, wheat etc.) +local replace = function(self, pos) + + if not self.replace_rate + 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 + return + end + + local what, with, y_offset + + if type(self.replace_what[1]) == "table" then + + local num = math_random(#self.replace_what) + + what = self.replace_what[num][1] or "" + with = self.replace_what[num][2] or "" + y_offset = self.replace_what[num][3] or 0 + else + what = self.replace_what + with = self.replace_with or "" + y_offset = self.replace_offset or 0 + end + + pos.y = pos.y + y_offset + + local node = minetest_get_node(pos) + if node.name == what then + + local oldnode = {name = what, param2 = node.param2} + local newnode = {name = with, param2 = node.param2} + local on_replace_return + + if self.on_replace then + on_replace_return = self.on_replace(self, pos, oldnode, newnode) + end + + if on_replace_return ~= false then + + if mobs_griefing then + minetest_set_node(pos, newnode) + end + + end + end +end + + +-- check if daytime and also if mob is docile during daylight hours +local day_docile = function(self) + + if self.docile_by_day == false then + + return false + + elseif self.docile_by_day == true + and self.time_of_day > 0.2 + and self.time_of_day < 0.8 then + + return true + end +end + + +-- deal damage and effects when mob punched +local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) + + -- custom punch function + if self.do_punch then + + -- when false skip going any further + if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then + return + end + end + + -- error checking when mod profiling is enabled + if not tool_capabilities then + minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") + return + end + + local is_player = hitter:is_player() + + if is_player then + -- is mob protected? + if self.protected and minetest_is_protected(self.object:get_pos(), hitter:get_player_name()) then + return + end + + -- set/update 'drop xp' timestamp if hitted by player + self.xp_timestamp = minetest_get_us_time() + end + + + -- punch interval + local weapon = hitter:get_wielded_item() + local punch_interval = 1.4 + + -- exhaust attacker + if mod_hunger and is_player then + mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK) + end + + -- calculate mob damage + local damage = 0 + local armor = self.object:get_armor_groups() or {} + local tmp + + -- quick error check incase it ends up 0 (serialize.h check test) + if tflp == 0 then + tflp = 0.2 + end + + if use_cmi then + damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) + else + + for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do + + tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) + + if tmp < 0 then + tmp = 0.0 + elseif tmp > 1 then + tmp = 1.0 + end + + damage = damage + (tool_capabilities.damage_groups[group] or 0) + * tmp * ((armor[group] or 0) / 100.0) + end + end + + if weapon then + local fire_aspect_level = mcl_enchanting.get_enchantment(weapon, "fire_aspect") + if fire_aspect_level > 0 then + mcl_burning.set_on_fire(self.object, fire_aspect_level * 4) + end + end + + -- check for tool immunity or special damage + for n = 1, #self.immune_to do + + if self.immune_to[n][1] == weapon:get_name() then + + damage = self.immune_to[n][2] or 0 + break + end + end + + -- healing + if damage <= -1 then + self.health = self.health - math_floor(damage) + return + end + + if use_cmi then + + local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) + + if cancel then return end + 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) + if minetest_is_creative_enabled("") ~= true + and tool_capabilities then + if tool_capabilities.punch_attack_uses then + -- Without this delay, the wear does not work. Quite hacky ... + minetest_after(0, function(name) + local player = minetest.get_player_by_name(name) + if not player then return end + 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) + weapon:add_wear(wear) + hitter:set_wielded_item(weapon) + end + end, hitter:get_player_name()) + end + end + + local die = false + + -- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately. + if damage >= 0.1 then + + -- weapon sounds + if weapon:get_definition().sounds ~= nil then + + local s = math_random(0, #weapon:get_definition().sounds) + + minetest_sound_play(weapon:get_definition().sounds[s], { + object = self.object, --hitter, + max_hear_distance = 8 + }, true) + else + minetest_sound_play("default_punch", { + object = self.object, + max_hear_distance = 5 + }, true) + end + + damage_effect(self, damage) + + -- do damage + self.health = self.health - damage + + -- skip future functions if dead, except alerting others + if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then + die = true + end + + -- knock back effect (only on full punch) + if not die + and self.knock_back + and tflp >= punch_interval then + + local v = self.object:get_velocity() + local r = 1.4 - math_min(punch_interval, 1.4) + local kb = r * 2.0 + local up = 2 + + -- if already in air then dont go up anymore when hit + if v.y ~= 0 + or self.fly then + up = 0 + end + + -- direction error check + dir = dir or {x = 0, y = 0, z = 0} + + -- check if tool already has specific knockback value + if tool_capabilities.damage_groups["knockback"] then + kb = tool_capabilities.damage_groups["knockback"] + else + kb = kb * 1.5 + end + + + local luaentity + if hitter then + luaentity = hitter:get_luaentity() + end + if hitter and is_player then + local wielditem = hitter:get_wielded_item() + kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") + elseif luaentity and luaentity._knockback then + kb = kb + luaentity._knockback + end + + self.object:set_velocity({ + x = dir.x * kb, + y = dir.y * kb + up * 2, + z = dir.z * kb + }) + + self.pause_timer = 0.25 + end + end -- END if damage + + -- if skittish then run away + if not die and self.runaway == true and self.state ~= "flop" then + + local lp = hitter:get_pos() + local s = self.object:get_pos() + local vec = { + x = lp.x - s.x, + y = lp.y - s.y, + z = lp.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + 3 * math_pi / 2) - self.rotate + + if lp.x > s.x then + yaw = yaw + math_pi + end + + yaw = set_yaw(self, yaw, 6) + self.state = "runaway" + self.runaway_timer = 0 + self.following = nil + end + + local name = hitter:get_player_name() or "" + + -- attack puncher and call other mobs for help + if self.passive == false + and self.state ~= "flop" + and (self.child == false or self.type == "monster") + and hitter:get_player_name() ~= self.owner + and not mobs.invis[ name ] then + + if not die then + -- attack whoever punched mob + self.state = "" + do_attack(self, hitter) + end + + -- alert others to the attack + local objs = minetest_get_objects_inside_radius(hitter:get_pos(), self.view_range) + local obj = nil + + for n = 1, #objs do + + obj = objs[n]:get_luaentity() + + if obj then + + -- only alert members of same mob or friends + if obj.group_attack + and obj.state ~= "attack" + and obj.owner ~= name then + if obj.name == self.name then + do_attack(obj, hitter) + elseif type(obj.group_attack) == "table" then + for i=1, #obj.group_attack do + if obj.name == obj.group_attack[i] then + do_attack(obj, hitter) + break + end + end + end + end + + -- have owned mobs attack player threat + if obj.owner == name and obj.owner_loyal then + do_attack(obj, self.object) + end + end + end + end +end + +local mob_detach_child = function(self, child) + + if self.driver == child then + self.driver = nil + end + +end \ No newline at end of file From 220d30df5f159d69be22663733feb1fbf51c45f8 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 13 Apr 2021 19:13:29 -0400 Subject: [PATCH 014/176] Completely gut do_states --- mods/ENTITIES/mcl_mobs/api.lua | 553 -------------------- mods/ENTITIES/mcl_mobs/backup_code_api.lua | 557 ++++++++++++++++++++- 2 files changed, 556 insertions(+), 554 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 9a32c394d5..6cc81aeb83 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -384,560 +384,7 @@ local do_states = function(self, dtime) local yaw = self.object:get_yaw() or 0 - --[[ - if self.state == "stand" then - - if math_random(1, 4) == 1 then - - local lp = nil - local s = self.object:get_pos() - local objs = minetest_get_objects_inside_radius(s, 3) - - for n = 1, #objs do - - if objs[n]:is_player() then - lp = objs[n]:get_pos() - break - end - end - - -- look at any players nearby, otherwise turn randomly - if lp then - - local vec = { - x = lp.x - s.x, - z = lp.z - s.z - } - - yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - - if lp.x > s.x then yaw = yaw + math_pi end - else - yaw = yaw + math_random(-0.5, 0.5) - end - - yaw = set_yaw(self, yaw, 8) - end - - set_velocity(self, 0) - set_animation(self, "stand") - - -- npc's ordered to stand stay standing - if self.type ~= "npc" - or self.order ~= "stand" then - - if self.walk_chance ~= 0 - and self.facing_fence ~= true - and math_random(1, 100) <= self.walk_chance - and is_at_cliff_or_danger(self) == false then - - set_velocity(self, self.walk_velocity) - self.state = "walk" - set_animation(self, "walk") - end - end - - elseif self.state == "walk" then - - local s = self.object:get_pos() - local lp = nil - - -- is there something I need to avoid? - if (self.water_damage > 0 - and self.lava_damage > 0) - or self.breath_max ~= -1 then - - lp = minetest_find_node_near(s, 1, {"group:water", "group:lava"}) - - elseif self.water_damage > 0 then - - lp = minetest_find_node_near(s, 1, {"group:water"}) - - elseif self.lava_damage > 0 then - - lp = minetest_find_node_near(s, 1, {"group:lava"}) - - elseif self.fire_damage > 0 then - - lp = minetest_find_node_near(s, 1, {"group:fire"}) - - end - - local is_in_danger = false - if lp then - -- If mob in or on dangerous block, look for land - if (is_node_dangerous(self, self.standing_in) or - is_node_dangerous(self, self.standing_on)) or (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) and (not self.fly) then - is_in_danger = true - - -- If mob in or on dangerous block, look for land - if is_in_danger then - -- Better way to find shore - copied from upstream - lp = minetest_find_nodes_in_area_under_air( - {x = s.x - 5, y = s.y - 0.5, z = s.z - 5}, - {x = s.x + 5, y = s.y + 1, z = s.z + 5}, - {"group:solid"}) - - lp = #lp > 0 and lp[math_random(#lp)] - - -- did we find land? - if lp then - - local vec = { - x = lp.x - s.x, - z = lp.z - s.z - } - - yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - - - if lp.x > s.x then yaw = yaw + math_pi end - - -- look towards land and move in that direction - yaw = set_yaw(self, yaw, 6) - set_velocity(self, self.walk_velocity) - - end - end - - -- A danger is near but mob is not inside - else - - -- Randomly turn - if math_random(1, 100) <= 30 then - yaw = yaw + math_random(-0.5, 0.5) - yaw = set_yaw(self, yaw, 8) - end - end - - yaw = set_yaw(self, yaw, 8) - - -- otherwise randomly turn - elseif math_random(1, 100) <= 30 then - - yaw = yaw + math_random(-0.5, 0.5) - yaw = set_yaw(self, yaw, 8) - end - - -- stand for great fall or danger or fence in front - local cliff_or_danger = false - if is_in_danger then - cliff_or_danger = is_at_cliff_or_danger(self) - end - if self.facing_fence == true - or cliff_or_danger - or math_random(1, 100) <= 30 then - - set_velocity(self, 0) - self.state = "stand" - set_animation(self, "stand") - local yaw = self.object:get_yaw() or 0 - yaw = set_yaw(self, yaw + 0.78, 8) - else - - set_velocity(self, self.walk_velocity) - - if flight_check(self) - and self.animation - and self.animation.fly_start - and self.animation.fly_end then - set_animation(self, "fly") - else - set_animation(self, "walk") - end - end - - -- runaway when punched - elseif self.state == "runaway" then - - self.runaway_timer = self.runaway_timer + 1 - - -- stop after 5 seconds or when at cliff - if self.runaway_timer > 5 - or is_at_cliff_or_danger(self) then - self.runaway_timer = 0 - set_velocity(self, 0) - self.state = "stand" - set_animation(self, "stand") - local yaw = self.object:get_yaw() or 0 - yaw = set_yaw(self, yaw + 0.78, 8) - else - set_velocity(self, self.run_velocity) - set_animation(self, "run") - end - - -- attack routines (explode, dogfight, shoot, dogshoot) - elseif self.state == "attack" then - - local s = self.object:get_pos() - local p = self.attack:get_pos() or s - - -- stop attacking if player invisible or out of range - if not self.attack - or not self.attack:get_pos() - or not object_in_range(self, self.attack) - or self.attack:get_hp() <= 0 - or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then - - self.state = "stand" - set_velocity(self, 0) - set_animation(self, "stand") - self.attack = nil - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.path.way = nil - - return - end - - -- calculate distance from mob and enemy - local dist = vector.distance(p, s) - - if self.attack_type == "explode" then - - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - - yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + math_pi end - - yaw = set_yaw(self, yaw, 0, dtime) - - local node_break_radius = self.explosion_radius or 1 - local entity_damage_radius = self.explosion_damage_radius - or (node_break_radius * 2) - - -- start timer when in reach and line of sight - if not self.v_start - and dist <= self.reach - and line_of_sight(self, s, p, 2) then - - self.v_start = true - self.timer = 0 - self.blinktimer = 0 - mob_sound(self, "fuse", nil, false) - - -- stop timer if out of reach or direct line of sight - elseif self.allow_fuse_reset - and self.v_start - and (dist >= self.explosiontimer_reset_radius - or not line_of_sight(self, s, p, 2)) then - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.blinkstatus = false - remove_texture_mod(self, "^[brighten") - end - - -- walk right up to player unless the timer is active - if self.v_start and (self.stop_to_explode or dist < self.reach) then - set_velocity(self, 0) - else - set_velocity(self, self.run_velocity) - end - - if self.animation and self.animation.run_start then - set_animation(self, "run") - else - set_animation(self, "walk") - end - - if self.v_start then - - self.timer = self.timer + dtime - self.blinktimer = (self.blinktimer or 0) + dtime - - if self.blinktimer > 0.2 then - - self.blinktimer = 0 - - if self.blinkstatus then - remove_texture_mod(self, "^[brighten") - else - add_texture_mod(self, "^[brighten") - end - - self.blinkstatus = not self.blinkstatus - end - - if self.timer > self.explosion_timer then - - local pos = self.object:get_pos() - - if mod_explosions then - if mobs_griefing and not minetest_is_protected(pos, "") then - mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object) - else - minetest_sound_play(self.sounds.explode, { - pos = pos, - gain = 1.0, - max_hear_distance = self.sounds.distance or 32 - }, true) - - entity_physics(pos, entity_damage_radius) - effect(pos, 32, "mcl_particles_smoke.png", nil, nil, node_break_radius, 1, 0) - end - end - mcl_burning.extinguish(self.object) - self.object:remove() - - return true - end - end - - elseif self.attack_type == "dogfight" - or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 2) - or (self.attack_type == "dogshoot" and dist <= self.reach and dogswitch(self) == 0) then - - if self.fly - and dist > self.reach then - - local p1 = s - local me_y = math_floor(p1.y) - local p2 = p - local p_y = math_floor(p2.y + 1) - local v = self.object:get_velocity() - - if flight_check(self, s) then - - if me_y < p_y then - - self.object:set_velocity({ - x = v.x, - y = 1 * self.walk_velocity, - z = v.z - }) - - elseif me_y > p_y then - - self.object:set_velocity({ - x = v.x, - y = -1 * self.walk_velocity, - z = v.z - }) - end - else - if me_y < p_y then - - self.object:set_velocity({ - x = v.x, - y = 0.01, - z = v.z - }) - - elseif me_y > p_y then - - self.object:set_velocity({ - x = v.x, - y = -0.01, - z = v.z - }) - end - end - - end - - -- rnd: new movement direction - if self.path.following - and self.path.way - and self.attack_type ~= "dogshoot" then - - -- no paths longer than 50 - if #self.path.way > 50 - or dist < self.reach then - self.path.following = false - return - end - - local p1 = self.path.way[1] - - if not p1 then - self.path.following = false - return - end - - if math_abs(p1.x-s.x) + math_abs(p1.z - s.z) < 0.6 then - -- reached waypoint, remove it from queue - table.remove(self.path.way, 1) - end - - -- set new temporary target - p = {x = p1.x, y = p1.y, z = p1.z} - end - - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - - yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + math_pi end - - yaw = set_yaw(self, yaw, 0, dtime) - - -- move towards enemy if beyond mob reach - if dist > self.reach then - - -- path finding by rnd - if self.pathfinding -- only if mob has pathfinding enabled - and enable_pathfinding then - - smart_mobs(self, s, p, dist, dtime) - end - - if is_at_cliff_or_danger(self) then - - set_velocity(self, 0) - set_animation(self, "stand") - local yaw = self.object:get_yaw() or 0 - yaw = set_yaw(self, yaw + 0.78, 8) - else - - if self.path.stuck then - set_velocity(self, self.walk_velocity) - else - set_velocity(self, self.run_velocity) - end - - if self.animation and self.animation.run_start then - set_animation(self, "run") - else - set_animation(self, "walk") - end - end - - else -- rnd: if inside reach range - - self.path.stuck = false - self.path.stuck_timer = 0 - self.path.following = false -- not stuck anymore - - set_velocity(self, 0) - - if not self.custom_attack then - - if self.timer > 1 then - - self.timer = 0 - - if self.double_melee_attack - and math_random(1, 2) == 1 then - set_animation(self, "punch2") - else - set_animation(self, "punch") - end - - local p2 = p - local s2 = s - - p2.y = p2.y + .5 - s2.y = s2.y + .5 - - if line_of_sight(self, p2, s2) == true then - - -- play attack sound - mob_sound(self, "attack") - - -- punch player (or what player is attached to) - local attached = self.attack:get_attach() - if attached then - self.attack = attached - end - self.attack:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = self.damage} - }, nil) - end - end - else -- call custom attack every second - if self.custom_attack - and self.timer > 1 then - - self.timer = 0 - - self.custom_attack(self, p) - end - end - end - - elseif self.attack_type == "shoot" - or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 1) - or (self.attack_type == "dogshoot" and dist > self.reach and dogswitch(self) == 0) then - - p.y = p.y - .5 - s.y = s.y + .5 - - local dist = vector.distance(p, s) - local vec = { - x = p.x - s.x, - y = p.y - s.y, - z = p.z - s.z - } - - yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + math_pi end - - yaw = set_yaw(self, yaw, 0, dtime) - - set_velocity(self, 0) - - local p = self.object:get_pos() - p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 - - 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 - - self.timer = 0 - set_animation(self, "shoot") - - -- play shoot attack sound - mob_sound(self, "shoot_attack") - - -- Shoot arrow - if minetest_registered_entities[self.arrow] then - - local arrow, ent - local v = 1 - if not self.shoot_arrow then - self.firing = true - minetest_after(1, function() - self.firing = false - end) - arrow = minetest_add_entity(p, self.arrow) - ent = arrow:get_luaentity() - if ent.velocity then - v = ent.velocity - end - ent.switch = 1 - ent.owner_id = tostring(self.object) -- add unique owner id to arrow - end - - local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 - -- offset makes shoot aim accurate - vec.y = vec.y + self.shoot_offset - vec.x = vec.x * (v / amount) - vec.y = vec.y * (v / amount) - vec.z = vec.z * (v / amount) - if self.shoot_arrow then - vec = vector.normalize(vec) - self:shoot_arrow(p, vec) - else - arrow:set_velocity(vec) - end - end - end - end - end - ]]-- end diff --git a/mods/ENTITIES/mcl_mobs/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/backup_code_api.lua index 85cf0db5f0..88b6eb0414 100644 --- a/mods/ENTITIES/mcl_mobs/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/backup_code_api.lua @@ -2593,4 +2593,559 @@ local mob_detach_child = function(self, child) self.driver = nil end -end \ No newline at end of file +end + + --[[ + + if self.state == "stand" then + + if math_random(1, 4) == 1 then + + local lp = nil + local s = self.object:get_pos() + local objs = minetest_get_objects_inside_radius(s, 3) + + for n = 1, #objs do + + if objs[n]:is_player() then + lp = objs[n]:get_pos() + break + end + end + + -- look at any players nearby, otherwise turn randomly + if lp then + + local vec = { + x = lp.x - s.x, + z = lp.z - s.z + } + + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate + + if lp.x > s.x then yaw = yaw + math_pi end + else + yaw = yaw + math_random(-0.5, 0.5) + end + + yaw = set_yaw(self, yaw, 8) + end + + set_velocity(self, 0) + set_animation(self, "stand") + + -- npc's ordered to stand stay standing + if self.type ~= "npc" + or self.order ~= "stand" then + + if self.walk_chance ~= 0 + and self.facing_fence ~= true + and math_random(1, 100) <= self.walk_chance + and is_at_cliff_or_danger(self) == false then + + set_velocity(self, self.walk_velocity) + self.state = "walk" + set_animation(self, "walk") + end + end + + elseif self.state == "walk" then + + local s = self.object:get_pos() + local lp = nil + + -- is there something I need to avoid? + if (self.water_damage > 0 + and self.lava_damage > 0) + or self.breath_max ~= -1 then + + lp = minetest_find_node_near(s, 1, {"group:water", "group:lava"}) + + elseif self.water_damage > 0 then + + lp = minetest_find_node_near(s, 1, {"group:water"}) + + elseif self.lava_damage > 0 then + + lp = minetest_find_node_near(s, 1, {"group:lava"}) + + elseif self.fire_damage > 0 then + + lp = minetest_find_node_near(s, 1, {"group:fire"}) + + end + + local is_in_danger = false + if lp then + -- If mob in or on dangerous block, look for land + if (is_node_dangerous(self, self.standing_in) or + is_node_dangerous(self, self.standing_on)) or (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) and (not self.fly) then + is_in_danger = true + + -- If mob in or on dangerous block, look for land + if is_in_danger then + -- Better way to find shore - copied from upstream + lp = minetest_find_nodes_in_area_under_air( + {x = s.x - 5, y = s.y - 0.5, z = s.z - 5}, + {x = s.x + 5, y = s.y + 1, z = s.z + 5}, + {"group:solid"}) + + lp = #lp > 0 and lp[math_random(#lp)] + + -- did we find land? + if lp then + + local vec = { + x = lp.x - s.x, + z = lp.z - s.z + } + + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate + + + if lp.x > s.x then yaw = yaw + math_pi end + + -- look towards land and move in that direction + yaw = set_yaw(self, yaw, 6) + set_velocity(self, self.walk_velocity) + + end + end + + -- A danger is near but mob is not inside + else + + -- Randomly turn + if math_random(1, 100) <= 30 then + yaw = yaw + math_random(-0.5, 0.5) + yaw = set_yaw(self, yaw, 8) + end + end + + yaw = set_yaw(self, yaw, 8) + + -- otherwise randomly turn + elseif math_random(1, 100) <= 30 then + + yaw = yaw + math_random(-0.5, 0.5) + yaw = set_yaw(self, yaw, 8) + end + + -- stand for great fall or danger or fence in front + local cliff_or_danger = false + if is_in_danger then + cliff_or_danger = is_at_cliff_or_danger(self) + end + if self.facing_fence == true + or cliff_or_danger + or math_random(1, 100) <= 30 then + + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + local yaw = self.object:get_yaw() or 0 + yaw = set_yaw(self, yaw + 0.78, 8) + else + + set_velocity(self, self.walk_velocity) + + if flight_check(self) + and self.animation + and self.animation.fly_start + and self.animation.fly_end then + set_animation(self, "fly") + else + set_animation(self, "walk") + end + end + + -- runaway when punched + elseif self.state == "runaway" then + + self.runaway_timer = self.runaway_timer + 1 + + -- stop after 5 seconds or when at cliff + if self.runaway_timer > 5 + or is_at_cliff_or_danger(self) then + self.runaway_timer = 0 + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + local yaw = self.object:get_yaw() or 0 + yaw = set_yaw(self, yaw + 0.78, 8) + else + set_velocity(self, self.run_velocity) + set_animation(self, "run") + end + + -- attack routines (explode, dogfight, shoot, dogshoot) + elseif self.state == "attack" then + + local s = self.object:get_pos() + local p = self.attack:get_pos() or s + + -- stop attacking if player invisible or out of range + if not self.attack + or not self.attack:get_pos() + or not object_in_range(self, self.attack) + or self.attack:get_hp() <= 0 + or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then + + self.state = "stand" + set_velocity(self, 0) + set_animation(self, "stand") + self.attack = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.path.way = nil + + return + end + + -- calculate distance from mob and enemy + local dist = vector.distance(p, s) + + if self.attack_type == "explode" then + + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + math_pi end + + yaw = set_yaw(self, yaw, 0, dtime) + + local node_break_radius = self.explosion_radius or 1 + local entity_damage_radius = self.explosion_damage_radius + or (node_break_radius * 2) + + -- start timer when in reach and line of sight + if not self.v_start + and dist <= self.reach + and line_of_sight(self, s, p, 2) then + + self.v_start = true + self.timer = 0 + self.blinktimer = 0 + mob_sound(self, "fuse", nil, false) + + -- stop timer if out of reach or direct line of sight + elseif self.allow_fuse_reset + and self.v_start + and (dist >= self.explosiontimer_reset_radius + or not line_of_sight(self, s, p, 2)) then + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.blinkstatus = false + remove_texture_mod(self, "^[brighten") + end + + -- walk right up to player unless the timer is active + if self.v_start and (self.stop_to_explode or dist < self.reach) then + set_velocity(self, 0) + else + set_velocity(self, self.run_velocity) + end + + if self.animation and self.animation.run_start then + set_animation(self, "run") + else + set_animation(self, "walk") + end + + if self.v_start then + + self.timer = self.timer + dtime + self.blinktimer = (self.blinktimer or 0) + dtime + + if self.blinktimer > 0.2 then + + self.blinktimer = 0 + + if self.blinkstatus then + remove_texture_mod(self, "^[brighten") + else + add_texture_mod(self, "^[brighten") + end + + self.blinkstatus = not self.blinkstatus + end + + if self.timer > self.explosion_timer then + + local pos = self.object:get_pos() + + if mod_explosions then + if mobs_griefing and not minetest_is_protected(pos, "") then + mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object) + else + minetest_sound_play(self.sounds.explode, { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds.distance or 32 + }, true) + + entity_physics(pos, entity_damage_radius) + effect(pos, 32, "mcl_particles_smoke.png", nil, nil, node_break_radius, 1, 0) + end + end + mcl_burning.extinguish(self.object) + self.object:remove() + + return true + end + end + + elseif self.attack_type == "dogfight" + or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 2) + or (self.attack_type == "dogshoot" and dist <= self.reach and dogswitch(self) == 0) then + + if self.fly + and dist > self.reach then + + local p1 = s + local me_y = math_floor(p1.y) + local p2 = p + local p_y = math_floor(p2.y + 1) + local v = self.object:get_velocity() + + if flight_check(self, s) then + + if me_y < p_y then + + self.object:set_velocity({ + x = v.x, + y = 1 * self.walk_velocity, + z = v.z + }) + + elseif me_y > p_y then + + self.object:set_velocity({ + x = v.x, + y = -1 * self.walk_velocity, + z = v.z + }) + end + else + if me_y < p_y then + + self.object:set_velocity({ + x = v.x, + y = 0.01, + z = v.z + }) + + elseif me_y > p_y then + + self.object:set_velocity({ + x = v.x, + y = -0.01, + z = v.z + }) + end + end + + end + + -- rnd: new movement direction + if self.path.following + and self.path.way + and self.attack_type ~= "dogshoot" then + + -- no paths longer than 50 + if #self.path.way > 50 + or dist < self.reach then + self.path.following = false + return + end + + local p1 = self.path.way[1] + + if not p1 then + self.path.following = false + return + end + + if math_abs(p1.x-s.x) + math_abs(p1.z - s.z) < 0.6 then + -- reached waypoint, remove it from queue + table.remove(self.path.way, 1) + end + + -- set new temporary target + p = {x = p1.x, y = p1.y, z = p1.z} + end + + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + math_pi end + + yaw = set_yaw(self, yaw, 0, dtime) + + -- move towards enemy if beyond mob reach + if dist > self.reach then + + -- path finding by rnd + if self.pathfinding -- only if mob has pathfinding enabled + and enable_pathfinding then + + smart_mobs(self, s, p, dist, dtime) + end + + if is_at_cliff_or_danger(self) then + + set_velocity(self, 0) + set_animation(self, "stand") + local yaw = self.object:get_yaw() or 0 + yaw = set_yaw(self, yaw + 0.78, 8) + else + + if self.path.stuck then + set_velocity(self, self.walk_velocity) + else + set_velocity(self, self.run_velocity) + end + + if self.animation and self.animation.run_start then + set_animation(self, "run") + else + set_animation(self, "walk") + end + end + + else -- rnd: if inside reach range + + self.path.stuck = false + self.path.stuck_timer = 0 + self.path.following = false -- not stuck anymore + + set_velocity(self, 0) + + if not self.custom_attack then + + if self.timer > 1 then + + self.timer = 0 + + if self.double_melee_attack + and math_random(1, 2) == 1 then + set_animation(self, "punch2") + else + set_animation(self, "punch") + end + + local p2 = p + local s2 = s + + p2.y = p2.y + .5 + s2.y = s2.y + .5 + + if line_of_sight(self, p2, s2) == true then + + -- play attack sound + mob_sound(self, "attack") + + -- punch player (or what player is attached to) + local attached = self.attack:get_attach() + if attached then + self.attack = attached + end + self.attack:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self.damage} + }, nil) + end + end + else -- call custom attack every second + if self.custom_attack + and self.timer > 1 then + + self.timer = 0 + + self.custom_attack(self, p) + end + end + end + + elseif self.attack_type == "shoot" + or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 1) + or (self.attack_type == "dogshoot" and dist > self.reach and dogswitch(self) == 0) then + + p.y = p.y - .5 + s.y = s.y + .5 + + local dist = vector.distance(p, s) + local vec = { + x = p.x - s.x, + y = p.y - s.y, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + math_pi end + + yaw = set_yaw(self, yaw, 0, dtime) + + set_velocity(self, 0) + + local p = self.object:get_pos() + p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 + + 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 + + self.timer = 0 + set_animation(self, "shoot") + + -- play shoot attack sound + mob_sound(self, "shoot_attack") + + -- Shoot arrow + if minetest_registered_entities[self.arrow] then + + local arrow, ent + local v = 1 + if not self.shoot_arrow then + self.firing = true + minetest_after(1, function() + self.firing = false + end) + arrow = minetest_add_entity(p, self.arrow) + ent = arrow:get_luaentity() + if ent.velocity then + v = ent.velocity + end + ent.switch = 1 + ent.owner_id = tostring(self.object) -- add unique owner id to arrow + end + + local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 + -- offset makes shoot aim accurate + vec.y = vec.y + self.shoot_offset + vec.x = vec.x * (v / amount) + vec.y = vec.y * (v / amount) + vec.z = vec.z * (v / amount) + if self.shoot_arrow then + vec = vector.normalize(vec) + self:shoot_arrow(p, vec) + else + arrow:set_velocity(vec) + end + end + end + end + end + ]]-- \ No newline at end of file From ed6026671381c99723eccbf2089d99748e19bfe2 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 13 Apr 2021 19:17:48 -0400 Subject: [PATCH 015/176] Gut even more elements of the api --- mods/ENTITIES/mcl_mobs/api.lua | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 6cc81aeb83..fff3125911 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -604,14 +604,15 @@ end local mob_step = function(self, dtime) + --do not continue if non-existent if not self or not self.object or not self.object:get_luaentity() then return false end - if self.state == "die" then - print("need custom die stop moving thing") - return - end + --if self.state == "die" then + -- print("need custom die stop moving thing") + -- return + --end -- can mob be pushed, if so calculate direction -- do this first to prevent issues if self.pushable then @@ -629,8 +630,8 @@ local mob_step = function(self, dtime) --cmi.notify_step(self.object, dtime) --end - local pos = self.object:get_pos() - local yaw = 0 + --local pos = self.object:get_pos() + --local yaw = 0 --if mobs_debug then --update_tag(self) @@ -653,6 +654,7 @@ local mob_step = function(self, dtime) -- smooth rotation by ThomasMonroe314 + --[[ if self.delay and self.delay > 0 then local yaw = self.object:get_yaw() or 0 @@ -692,6 +694,7 @@ local mob_step = function(self, dtime) self.object:set_yaw(yaw) --update_roll(self) end + ]]-- -- end rotation From 1210bc463adb949496fc521e3169fb88e49fc4e9 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 13 Apr 2021 19:44:24 -0400 Subject: [PATCH 016/176] prevent mob collision detection shootout --- mods/ENTITIES/mcl_mobs/api.lua | 42 ++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index fff3125911..13bcdf6413 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -140,10 +140,18 @@ if minetest_settings:get_bool("only_peaceful_mobs", false) then end) end +local integer_test = {-1,1} +--slightly adjust mob position to prevent equal length + --corner/wall sticking + pos.x = pos.x + ((math_random()/2)*integer_test[math.random(1,2)]) + pos.z = pos.z + ((math_random()/2)*integer_test[math.random(1,2)]) + local collision = function(self) pos = self.object:get_pos() - --do collision detection from the base of the mob + + + --do collision detection from the base of the mob collisionbox = self.object:get_properties().collisionbox pos.y = pos.y + collisionbox[2] @@ -189,6 +197,7 @@ local collision = function(self) if distance <= collision_boundary + object_collision_boundary and y_base_diff >= 0 and y_top_diff >= 0 then dir = vector.direction(pos,pos2) + dir.y = 0 --eliminate mob being stuck in corners @@ -196,19 +205,32 @@ local collision = function(self) dir = vector.new(math_random(-1,1)*math_random(),0,math_random(-1,1)*math_random()) end - local velocity = vector.multiply(dir,1.1) + ---- JUST MAKE THIS DIR FROM NOW ON --- FIX MEEEEE + local velocity = dir--vector.multiply(dir,1.1) --local velocity = vector.normalize(dir) vel1 = vector.multiply(velocity, -1) vel2 = velocity - self.object:add_velocity(vel1) + + local current_mob_velocity = self.object:get_velocity() + + + if math.abs(current_mob_velocity.x) < 2 and math.abs(current_mob_velocity.z) < 2 then + self.object:add_velocity(vel1) + end --reenable fire spreading eventually if object:is_player() then - object:add_player_velocity(vel2) + + local current_vel = object:get_velocity() + + if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then + object:add_player_velocity(vel2) + end + --if self.on_fire then -- start_fire(object) @@ -219,7 +241,10 @@ local collision = function(self) --end else - object:add_velocity(vel2) + local current_vel = object:get_velocity() + if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then + object:add_velocity(vel2) + end --if self.on_fire then -- start_fire(object) --end @@ -381,7 +406,6 @@ end -- execute current state (stand, walk, run, attacks) -- returns true if mob has died local do_states = function(self, dtime) - local yaw = self.object:get_yaw() or 0 @@ -619,6 +643,8 @@ local mob_step = function(self, dtime) collision(self) end + do_states(self, dtime) + @@ -763,10 +789,6 @@ local mob_step = function(self, dtime) --breed(self) - --if do_states(self, dtime) then - -- return - --end - --do_jump(self) --runaway_from(self) From aa4d34c10e4bc367fc6ad7d898cd145d9f58ed0c Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 13 Apr 2021 20:00:38 -0400 Subject: [PATCH 017/176] Improve mob to mob collision --- mods/ENTITIES/mcl_mobs/api.lua | 74 ++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 13bcdf6413..cd5379bc86 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -140,69 +140,67 @@ if minetest_settings:get_bool("only_peaceful_mobs", false) then end) end + local integer_test = {-1,1} ---slightly adjust mob position to prevent equal length - --corner/wall sticking - pos.x = pos.x + ((math_random()/2)*integer_test[math.random(1,2)]) - pos.z = pos.z + ((math_random()/2)*integer_test[math.random(1,2)]) local collision = function(self) - pos = self.object:get_pos() - - + local pos = self.object:get_pos() --do collision detection from the base of the mob - collisionbox = self.object:get_properties().collisionbox + local collisionbox = self.object:get_properties().collisionbox pos.y = pos.y + collisionbox[2] - collision_boundary = collisionbox[4] + local collision_boundary = collisionbox[4] - radius = collision_boundary + local radius = collision_boundary if collisionbox[5] > collision_boundary then radius = collisionbox[5] end - collision_count = 0 + local collision_count = 0 for _,object in ipairs(minetest_get_objects_inside_radius(pos, radius*1.25)) do - if object ~= self.object and (object:is_player() or object:get_luaentity()._cmi_is_mob == true) and + if object and object ~= self.object and (object:is_player() or object:get_luaentity()._cmi_is_mob == true) then--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 self.object:get_attach() or (self.object:get_attach() and self.object:get_attach() ~= object)) then + --(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 if collision_count > 100 then break end - pos2 = object:get_pos() + local pos2 = object:get_pos() - object_collisionbox = object:get_properties().collisionbox + local object_collisionbox = object:get_properties().collisionbox pos2.y = pos2.y + object_collisionbox[2] - object_collision_boundary = object_collisionbox[4] + local object_collision_boundary = object_collisionbox[4] --this is checking the difference of the object collided with's possision --if positive top of other object is inside (y axis) of current object - y_base_diff = (pos2.y + object_collisionbox[5]) - pos.y + local y_base_diff = (pos2.y + object_collisionbox[5]) - pos.y - y_top_diff = (pos.y + collisionbox[5]) - pos2.y + local y_top_diff = (pos.y + collisionbox[5]) - pos2.y - distance = vector.distance(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z)) + local distance = vector.distance(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z)) if distance <= collision_boundary + object_collision_boundary and y_base_diff >= 0 and y_top_diff >= 0 then - dir = vector.direction(pos,pos2) + local dir = vector.direction(pos,pos2) dir.y = 0 --eliminate mob being stuck in corners if dir.x == 0 and dir.z == 0 then - dir = vector.new(math_random(-1,1)*math_random(),0,math_random(-1,1)*math_random()) + --slightly adjust mob position to prevent equal length + --corner/wall sticking + dir.x = dir.x + ((math_random()/2)*integer_test[math.random(1,2)]) + dir.z = dir.z + ((math_random()/2)*integer_test[math.random(1,2)]) end ---- JUST MAKE THIS DIR FROM NOW ON --- FIX MEEEEE @@ -210,16 +208,21 @@ local collision = function(self) --local velocity = vector.normalize(dir) - vel1 = vector.multiply(velocity, -1) - vel2 = velocity + local vel1 = vector.multiply(velocity, -1) + local vel2 = velocity local current_mob_velocity = self.object:get_velocity() - if math.abs(current_mob_velocity.x) < 2 and math.abs(current_mob_velocity.z) < 2 then - self.object:add_velocity(vel1) - end + local new_mob_velocity = vector.subtract(vel1, current_mob_velocity) + + new_mob_velocity.y = 0 + + + --if math.abs(current_mob_velocity.x) < 2 and math.abs(current_mob_velocity.z) < 2 then + self.object:add_velocity(new_mob_velocity) + --end --reenable fire spreading eventually @@ -227,6 +230,12 @@ local collision = function(self) local current_vel = object:get_velocity() + + --local new_vel = vector.subtract(vel2, current_vel) + + --new_vel.y = 0 + + if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then object:add_player_velocity(vel2) end @@ -242,9 +251,14 @@ local collision = function(self) else local current_vel = object:get_velocity() - if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then - object:add_velocity(vel2) - end + + local new_vel = vector.subtract(vel2, current_vel) + + new_vel.y = 0 + + --if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then + object:add_velocity(new_vel) + --end --if self.on_fire then -- start_fire(object) --end From 3f6312a631c6726c3bc4b09d9ec3e64b3ae810e5 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 13 Apr 2021 20:24:46 -0400 Subject: [PATCH 018/176] Make mobs magnetic collision more jello-y --- mods/ENTITIES/mcl_mobs/api.lua | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index cd5379bc86..a8307be609 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -208,27 +208,31 @@ local collision = function(self) --local velocity = vector.normalize(dir) + local force = 1 - (1 * distance / (collision_boundary + object_collision_boundary)) + local vel1 = vector.multiply(velocity, -1) local vel2 = velocity - - local current_mob_velocity = self.object:get_velocity() + vel1 = vector.multiply(vel1, force) + vel2 = vector.multiply(vel2, force) - local new_mob_velocity = vector.subtract(vel1, current_mob_velocity) - new_mob_velocity.y = 0 + --local current_mob_velocity = self.object:get_velocity() + + --print(distance) + --print(collision_boundary + object_collision_boundary) --if math.abs(current_mob_velocity.x) < 2 and math.abs(current_mob_velocity.z) < 2 then - self.object:add_velocity(new_mob_velocity) + self.object:add_velocity(vel1) --end --reenable fire spreading eventually if object:is_player() then - local current_vel = object:get_velocity() + --local current_vel = object:get_velocity() --local new_vel = vector.subtract(vel2, current_vel) @@ -236,9 +240,9 @@ local collision = function(self) --new_vel.y = 0 - if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then + --if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then object:add_player_velocity(vel2) - end + --end --if self.on_fire then @@ -250,15 +254,15 @@ local collision = function(self) --end else - local current_vel = object:get_velocity() + -- local current_vel = object:get_velocity() - local new_vel = vector.subtract(vel2, current_vel) + -- local new_vel = vector.subtract(vel2, current_vel) - new_vel.y = 0 + -- new_vel.y = 0 - --if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then - object:add_velocity(new_vel) - --end + -- if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then + object:add_velocity(vel2) + -- end --if self.on_fire then -- start_fire(object) --end From 755533beeb6c708603096cce4f99bea558c8b6ce Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 14 Apr 2021 11:50:22 -0400 Subject: [PATCH 019/176] Disable literally everything in mobs api --- mods/ENTITIES/mcl_mobs/api.lua | 41 +++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index a8307be609..7e6f26df77 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -43,7 +43,8 @@ local math_random = math.random local math_floor = math.floor -- localize vector functions -local vector_new = vector.new +local vector_new = vector.new +local vector_length = vector.length mobs = {} -- mob constants @@ -144,6 +145,7 @@ end local integer_test = {-1,1} local collision = function(self) + --[[ local pos = self.object:get_pos() --do collision detection from the base of the mob @@ -159,6 +161,10 @@ local collision = function(self) radius = collisionbox[5] end + if self.object:get_properties().collide_with_objects == true then + print("THIS IS A SERIOUS ERROR!") + end + local collision_count = 0 for _,object in ipairs(minetest_get_objects_inside_radius(pos, radius*1.25)) do @@ -171,6 +177,7 @@ local collision = function(self) if collision_count > 100 then break end + local pos2 = object:get_pos() local object_collisionbox = object:get_properties().collisionbox @@ -199,8 +206,8 @@ local collision = function(self) if dir.x == 0 and dir.z == 0 then --slightly adjust mob position to prevent equal length --corner/wall sticking - dir.x = dir.x + ((math_random()/2)*integer_test[math.random(1,2)]) - dir.z = dir.z + ((math_random()/2)*integer_test[math.random(1,2)]) + dir.x = dir.x + ((math_random()/10)*integer_test[math.random(1,2)]) + dir.z = dir.z + ((math_random()/10)*integer_test[math.random(1,2)]) end ---- JUST MAKE THIS DIR FROM NOW ON --- FIX MEEEEE @@ -217,31 +224,31 @@ local collision = function(self) vel2 = vector.multiply(vel2, force) - - --local current_mob_velocity = self.object:get_velocity() + local current_mob_velocity = self.object:get_velocity() - --print(distance) - --print(collision_boundary + object_collision_boundary) - - --if math.abs(current_mob_velocity.x) < 2 and math.abs(current_mob_velocity.z) < 2 then - self.object:add_velocity(vel1) + --if vector_length(current_mob_velocity) <= 1 then + --self.object:add_velocity(vel1) --end + --reenable fire spreading eventually if object:is_player() then + print("there is something seriously wrong here") --local current_vel = object:get_velocity() + --print(vector.length(current_vel)) + --local new_vel = vector.subtract(vel2, current_vel) --new_vel.y = 0 --if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then - object:add_player_velocity(vel2) + --object:add_velocity(new_vel) --end @@ -253,15 +260,15 @@ local collision = function(self) -- start_fire(self.object) --end - else - -- local current_vel = object:get_velocity() + --else + --local current_vel = object:get_velocity() - -- local new_vel = vector.subtract(vel2, current_vel) + --local new_vel = vector.subtract(vel2, current_vel) - -- new_vel.y = 0 + --new_vel.y = 0 -- if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then - object:add_velocity(vel2) + --object:add_velocity(new_vel) -- end --if self.on_fire then -- start_fire(object) @@ -271,8 +278,10 @@ local collision = function(self) --end end end + end end + ]]-- end From d4db27f0e1edd439f65821b814146a237ebea799 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 14 Apr 2021 17:25:39 -0400 Subject: [PATCH 020/176] Update backup_code_api.lua --- mods/ENTITIES/mcl_mobs/backup_code_api.lua | 120 ++++++++++++++++++++- 1 file changed, 119 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/backup_code_api.lua index 88b6eb0414..0791d5960c 100644 --- a/mods/ENTITIES/mcl_mobs/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/backup_code_api.lua @@ -3148,4 +3148,122 @@ end end end end - ]]-- \ No newline at end of file + ]]-- + + + mobs.death_effect = function(pos, yaw, collisionbox, rotate) + local min, max + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + else + min = { x = -0.5, y = 0, z = -0.5 } + 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, max = vector.sort(min, max) + min = vector.multiply(min, 0.5) + max = vector.multiply(max, 0.5) + end + + minetest_add_particlespawner({ + amount = 50, + time = 0.001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-5,-5,-5), + maxvel = vector.new(5,5,5), + minexptime = 1.1, + maxexptime = 1.5, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_mob_death.png^[colorize:#000000:255", + }) + + minetest_sound_play("mcl_mobs_mob_poof", { + pos = pos, + gain = 1.0, + max_hear_distance = 8, + }, true) + end + +-- above function exported for mount.lua +function mobs:set_animation(self, anim) + set_animation(self, anim) +end + + +-- set defined animation +local set_animation = function(self, anim, fixed_frame) + if not self.animation or not anim then + return + end + if self.state == "die" and anim ~= "die" and anim ~= "stand" then + return + end + + self.animation.current = self.animation.current or "" + + if (anim == self.animation.current + or not self.animation[anim .. "_start"] + or not self.animation[anim .. "_end"]) and self.state ~= "die" then + return + end + + self.animation.current = anim + + local a_start = self.animation[anim .. "_start"] + local a_end + if fixed_frame then + a_end = a_start + else + a_end = self.animation[anim .. "_end"] + end + + self.object:set_animation({ + x = a_start, + y = a_end}, + self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, + 0, self.animation[anim .. "_loop"] ~= false) +end + + +-- Code to execute before custom on_rightclick handling +local on_rightclick_prefix = function(self, clicker) + local item = clicker:get_wielded_item() + + -- Name mob with nametag + if not self.ignores_nametag and item:get_name() == "mcl_mobs:nametag" then + + local tag = item:get_meta():get_string("name") + if tag ~= "" then + if string.len(tag) > MAX_MOB_NAME_LENGTH then + tag = string.sub(tag, 1, MAX_MOB_NAME_LENGTH) + end + self.nametag = tag + + update_tag(self) + + if not mobs.is_creative(clicker:get_player_name()) then + item:take_item() + clicker:set_wielded_item(item) + end + return true + end + + end + return false +end + +local create_mob_on_rightclick = function(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 \ No newline at end of file From d063db751c1657c367f2277b24a5aa51a8d90fa3 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 14 Apr 2021 17:26:20 -0400 Subject: [PATCH 021/176] Disable mcl_playerplus random check that moves players randomly --- mods/PLAYER/mcl_playerplus/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index de346256fa..6dbf49f7f9 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -158,10 +158,10 @@ minetest.register_globalstep(function(dtime) c_x, c_y = unpack(player_collision(player)) - if player:get_velocity().x + player:get_velocity().y < .5 and c_x + c_y > 0 then + --if player:get_velocity().x + player:get_velocity().y < .5 and c_x + c_y > 0 then --minetest.chat_send_player(player:get_player_name(), "pushed at " .. c_x + c_y .. " parsecs.") - player:add_velocity({x=c_x, y=0, z=c_y}) - end + --player:add_velocity({x=c_x, y=0, z=c_y}) + --end --[[ _ _ _ From 67259891a85e54f56dc543087bd98cfe12feb6f4 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 14 Apr 2021 18:01:29 -0400 Subject: [PATCH 022/176] Remove unneeded comments --- mods/ENTITIES/mcl_mobs/api.lua | 71 ++++------------------------------ 1 file changed, 8 insertions(+), 63 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 7e6f26df77..9b730d2279 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -145,7 +145,7 @@ end local integer_test = {-1,1} local collision = function(self) - --[[ + local pos = self.object:get_pos() --do collision detection from the base of the mob @@ -210,78 +210,23 @@ local collision = function(self) dir.z = dir.z + ((math_random()/10)*integer_test[math.random(1,2)]) end - ---- JUST MAKE THIS DIR FROM NOW ON --- FIX MEEEEE - local velocity = dir--vector.multiply(dir,1.1) - - --local velocity = vector.normalize(dir) + local velocity = dir - local force = 1 - (1 * distance / (collision_boundary + object_collision_boundary)) + --0.5 is the max force multiplier + local force = 0.5 - (0.5 * distance / (collision_boundary + object_collision_boundary)) - local vel1 = vector.multiply(velocity, -1) - local vel2 = velocity + local vel1 = vector.multiply(velocity, -1.5) + local vel2 = vector.multiply(velocity, 1.5) vel1 = vector.multiply(vel1, force) vel2 = vector.multiply(vel2, force) - - - local current_mob_velocity = self.object:get_velocity() - - --if vector_length(current_mob_velocity) <= 1 then - --self.object:add_velocity(vel1) - --end - - - --reenable fire spreading eventually - - if object:is_player() then - - print("there is something seriously wrong here") - --local current_vel = object:get_velocity() - - - --print(vector.length(current_vel)) - - --local new_vel = vector.subtract(vel2, current_vel) - - --new_vel.y = 0 - - - --if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then - --object:add_velocity(new_vel) - --end - - - --if self.on_fire then - -- start_fire(object) - --end - - --if is_player_on_fire(object) then - -- start_fire(self.object) - --end - - --else - --local current_vel = object:get_velocity() - - --local new_vel = vector.subtract(vel2, current_vel) - - --new_vel.y = 0 - - -- if math.abs(current_vel.x) < 2 and math.abs(current_vel.z) < 2 then - --object:add_velocity(new_vel) - -- end - --if self.on_fire then - -- start_fire(object) - --end - --if object:get_luaentity().on_fire then - -- start_fire(self.object) - --end - end + self.object:add_velocity(vel1) + object:add_velocity(vel2) end end end - ]]-- end From 8b200c7352cb9fdd01f1b073308acacd36b2672a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 14 Apr 2021 19:38:14 -0400 Subject: [PATCH 023/176] Add in basic movement rotation testing --- mods/ENTITIES/mcl_mobs/api.lua | 7 ++++++- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 9b730d2279..152302e7d6 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -651,7 +651,6 @@ local mob_step = function(self, dtime) --end -- smooth rotation by ThomasMonroe314 - --[[ if self.delay and self.delay > 0 then @@ -1067,6 +1066,12 @@ minetest.register_entity(name, { _cmi_is_mob = true, pushable = def.pushable or true, + --j4i stuff + --automatic_rotate = 360, + automatic_face_movement_dir = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 + automatic_face_movement_max_rotation_per_sec = 360, + backface_culling = true, + --end j4i stuff -- MCL2 extensions teleport = teleport, diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 48fcc81975..be4cceea37 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -9,6 +9,7 @@ local cow_def = { hp_max = 10, xp_min = 1, xp_max = 3, + rotate = 270, collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.39, 0.45}, visual = "mesh", mesh = "mobs_mc_cow.b3d", From 61124905f3d862d00f00674067003d8da7722405 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 09:28:22 -0400 Subject: [PATCH 024/176] Add in mob auto rotation (implementation 1) --- mods/ENTITIES/mcl_mobs/api.lua | 100 ++++++++------------- mods/ENTITIES/mcl_mobs/backup_code_api.lua | 4 +- 2 files changed, 40 insertions(+), 64 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 152302e7d6..462cb00e3c 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -233,21 +233,29 @@ end -- move mob in facing direction local set_velocity = function(self, v) - local c_x, c_y = 0, 0 + --local c_x, c_y = 0, 0 -- halt mob if it has been ordered to stay - if self.order == "stand" then - self.object:set_velocity({x = 0, y = 0, z = 0}) - return - end + --if self.order == "stand" then + --self.object:set_velocity({x = 0, y = 0, z = 0}) + -- return + --end - local yaw = (self.object:get_yaw() or 0) + self.rotate + local yaw = (self.yaw or 0) - self.object:add_velocity({ - x = (math_sin(yaw) * -v) + c_x, - y = self.object:get_velocity().y, - z = (math_cos(yaw) * v) + c_y, - }) + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = (math_sin(yaw) * -v), + y = 0, + z = (math_cos(yaw) * v), + } + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + new_velocity_addition.y = 0 + + self.object:add_velocity(new_velocity_addition) end @@ -277,7 +285,7 @@ local set_yaw = function(self, yaw, delay, dtime) if self.shaking and dtime then yaw = yaw + (math_random() * 2 - 1) * 5 * dtime end - self.object:set_yaw(yaw) + self.yaw(yaw) update_roll(self) return yaw end @@ -380,7 +388,15 @@ end local do_states = function(self, dtime) local yaw = self.object:get_yaw() or 0 + self.state_timer = self.state_timer - dtime + if self.state_timer <= 0 then + self.state_timer = math.random(0,2) + math.random() + --let's do a random state + self.yaw = (math_random() * (math.pi * 2)) - math.pi + end + + set_velocity(self,1) end @@ -605,19 +621,21 @@ local mob_step = function(self, dtime) return false end + --print(self.object:get_yaw()) + --if self.state == "die" then -- print("need custom die stop moving thing") -- return --end - -- can mob be pushed, if so calculate direction -- do this first to prevent issues - if self.pushable then - collision(self) - end + do_states(self, dtime) - + -- can mob be pushed, if so calculate direction -- do this last (overrides everything) + if self.pushable then + collision(self) + end --if not self.fire_resistant then @@ -650,50 +668,6 @@ local mob_step = function(self, dtime) -- return --end - -- smooth rotation by ThomasMonroe314 - --[[ - if self.delay and self.delay > 0 then - - local yaw = self.object:get_yaw() or 0 - - if self.delay == 1 then - yaw = self.target_yaw - else - local dif = math_abs(yaw - self.target_yaw) - - if yaw > self.target_yaw then - - if dif > math_pi then - dif = 2 * math_pi - dif -- need to add - yaw = yaw + dif / self.delay - else - yaw = yaw - dif / self.delay -- need to subtract - end - - elseif yaw < self.target_yaw then - - if dif > math_pi then - dif = 2 * math_pi - dif - yaw = yaw - dif / self.delay -- need to subtract - else - yaw = yaw + dif / self.delay -- need to add - end - end - - if yaw > (math_pi * 2) then yaw = yaw - (math_pi * 2) end - if yaw < 0 then yaw = yaw + (math_pi * 2) end - end - - self.delay = self.delay - 1 - if self.shaking then - yaw = yaw + (math_random() * 2 - 1) * 5 * dtime - end - self.object:set_yaw(yaw) - --update_roll(self) - end - ]]-- - - -- end rotation -- run custom function (defined in mob lua file) --if self.do_custom then @@ -1028,6 +1002,7 @@ minetest.register_entity(name, { replace_offset = def.replace_offset or 0, on_replace = def.on_replace, timer = 0, + state_timer = 0, env_damage_timer = 0, tamed = false, pause_timer = 0, @@ -1068,8 +1043,9 @@ minetest.register_entity(name, { --j4i stuff --automatic_rotate = 360, + yaw = 0, automatic_face_movement_dir = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 - automatic_face_movement_max_rotation_per_sec = 360, + automatic_face_movement_max_rotation_per_sec = 270, --degrees backface_culling = true, --end j4i stuff diff --git a/mods/ENTITIES/mcl_mobs/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/backup_code_api.lua index 0791d5960c..97036fab81 100644 --- a/mods/ENTITIES/mcl_mobs/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/backup_code_api.lua @@ -2595,7 +2595,7 @@ local mob_detach_child = function(self, child) end - --[[ +function do_states(self) if self.state == "stand" then @@ -3148,7 +3148,7 @@ end end end end - ]]-- +end mobs.death_effect = function(pos, yaw, collisionbox, rotate) From ba46e7fa42bbd25175d3505ca9699a11912d491f Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 09:28:58 -0400 Subject: [PATCH 025/176] Remove old debug of colliding with objects --- mods/ENTITIES/mcl_mobs/api.lua | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 462cb00e3c..da5dc314fa 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -161,10 +161,6 @@ local collision = function(self) radius = collisionbox[5] end - if self.object:get_properties().collide_with_objects == true then - print("THIS IS A SERIOUS ERROR!") - end - local collision_count = 0 for _,object in ipairs(minetest_get_objects_inside_radius(pos, radius*1.25)) do From a0ed1a0b2004baeb3d0f64c5eb02bbf0b21bf823 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 10:05:24 -0400 Subject: [PATCH 026/176] Add automatic rotation lock --- mods/ENTITIES/mcl_mobs/api.lua | 76 +++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index da5dc314fa..0517d3cffa 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -389,7 +389,7 @@ local do_states = function(self, dtime) if self.state_timer <= 0 then self.state_timer = math.random(0,2) + math.random() --let's do a random state - self.yaw = (math_random() * (math.pi * 2)) - math.pi + self.yaw = (math_random() * (math.pi * 2)) end set_velocity(self,1) @@ -610,6 +610,25 @@ local mob_activate = function(self, staticdata, def, dtime) end +--this allows auto facedir rotation while making it so mobs +--don't look like wet noodles flopping around +local movement_rotation_lock = function(self) + + local current_engine_yaw = self.object:get_yaw() + local current_lua_yaw = self.yaw + + if current_engine_yaw > math.pi * 2 then + current_engine_yaw = current_engine_yaw - (math.pi * 2) + end + + if math.abs(current_engine_yaw - current_lua_yaw) <= 0.05 and self.object:get_properties().automatic_face_movement_dir then + self.object:set_properties{automatic_face_movement_dir = false} + elseif math.abs(current_engine_yaw - current_lua_yaw) > 0.05 and self.object:get_properties().automatic_face_movement_dir == false then + self.object:set_properties{automatic_face_movement_dir = self.rotate} + end +end + + local mob_step = function(self, dtime) --do not continue if non-existent @@ -625,9 +644,14 @@ local mob_step = function(self, dtime) --end + + do_states(self, dtime) + + movement_rotation_lock(self) + -- can mob be pushed, if so calculate direction -- do this last (overrides everything) if self.pushable then collision(self) @@ -947,7 +971,7 @@ minetest.register_entity(name, { spawn_small_alternative = def.spawn_small_alternative, do_custom = def.do_custom, jump_height = def.jump_height or 4, -- was 6 - rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 + rotate = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 lifetimer = def.lifetimer or 57.73, hp_min = scale_difficulty(def.hp_min, 5, 1), hp_max = scale_difficulty(def.hp_max, 10, 1), @@ -1108,6 +1132,54 @@ end end -- END mobs:register_mob function + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- register arrow for shoot attack function mobs:register_arrow(name, def) From 14207dd96aa60652c0ad1f4351441659c33d3ff6 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 11:23:52 -0400 Subject: [PATCH 027/176] Smooth out mob movement set_velocity more --- mods/ENTITIES/mcl_mobs/api.lua | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 0517d3cffa..4d3b2af4ad 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -229,14 +229,7 @@ end -- move mob in facing direction local set_velocity = function(self, v) - --local c_x, c_y = 0, 0 - - -- halt mob if it has been ordered to stay - --if self.order == "stand" then - --self.object:set_velocity({x = 0, y = 0, z = 0}) - -- return - --end - + local yaw = (self.yaw or 0) local current_velocity = self.object:get_velocity() @@ -247,11 +240,19 @@ local set_velocity = function(self, 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))) + end + new_velocity_addition.y = 0 - self.object:add_velocity(new_velocity_addition) + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end end @@ -620,7 +621,7 @@ local movement_rotation_lock = function(self) if current_engine_yaw > math.pi * 2 then current_engine_yaw = current_engine_yaw - (math.pi * 2) end - + if math.abs(current_engine_yaw - current_lua_yaw) <= 0.05 and self.object:get_properties().automatic_face_movement_dir then self.object:set_properties{automatic_face_movement_dir = false} elseif math.abs(current_engine_yaw - current_lua_yaw) > 0.05 and self.object:get_properties().automatic_face_movement_dir == false then @@ -1204,7 +1205,7 @@ function mobs:register_arrow(name, def) rotate = def.rotate, on_punch = function(self) local vel = self.object:get_velocity() - self.object:set_velocity({x=vel.x * -1, y=vel.y * -1, z=vel.z * -1}) + --self.object:set_velocity({x=vel.x * -1, y=vel.y * -1, z=vel.z * -1}) local pos = self.object:get_pos() if self.switch == 0 From e53a193c4fe61e88e6501a2a863e22d533132ae4 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 11:25:55 -0400 Subject: [PATCH 028/176] Fix get_velocity (mobs internal) --- mods/ENTITIES/mcl_mobs/api.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 4d3b2af4ad..f02d5b4336 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -261,8 +261,11 @@ end local get_velocity = function(self) local v = self.object:get_velocity() + + v.y = 0 + if v then - return (v.x * v.x + v.z * v.z) ^ 0.5 + return vector_length(v) end return 0 From 9e4bf6e130195b4f2176658581ad17646a48ce3a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 11:29:18 -0400 Subject: [PATCH 029/176] Move old set_yaw and add node on set_velocity --- mods/ENTITIES/mcl_mobs/api.lua | 34 ++-------------------- mods/ENTITIES/mcl_mobs/backup_code_api.lua | 32 +++++++++++++++++++- 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index f02d5b4336..58fee205ff 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -228,6 +228,9 @@ end -- move mob in facing direction +--this has been modified to be internal +--internal = lua (self.yaw) +--engine = c++ (self.object:get_yaw()) local set_velocity = function(self, v) local yaw = (self.yaw or 0) @@ -271,37 +274,6 @@ local get_velocity = function(self) return 0 end - --- set and return valid yaw -local set_yaw = function(self, yaw, delay, dtime) - - if not yaw or yaw ~= yaw then - yaw = 0 - end - - delay = delay or 0 - - if delay == 0 then - if self.shaking and dtime then - yaw = yaw + (math_random() * 2 - 1) * 5 * dtime - end - self.yaw(yaw) - update_roll(self) - return yaw - end - - self.target_yaw = yaw - self.delay = delay - - return self.target_yaw -end - --- global function to set mob yaw -function mobs:yaw(self, yaw, delay, dtime) - set_yaw(self, yaw, delay, dtime) -end - - -- set defined animation local set_animation = function(self, anim, fixed_frame) if not self.animation or not anim then diff --git a/mods/ENTITIES/mcl_mobs/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/backup_code_api.lua index 97036fab81..eb1389e371 100644 --- a/mods/ENTITIES/mcl_mobs/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/backup_code_api.lua @@ -3266,4 +3266,34 @@ local create_mob_on_rightclick = function(on_rightclick) on_rightclick(self, clicker) end end -end \ No newline at end of file +end + +-- set and return valid yaw +local set_yaw = function(self, yaw, delay, dtime) + + if not yaw or yaw ~= yaw then + yaw = 0 + end + + delay = delay or 0 + + if delay == 0 then + if self.shaking and dtime then + yaw = yaw + (math_random() * 2 - 1) * 5 * dtime + end + self.yaw(yaw) + update_roll(self) + return yaw + end + + self.target_yaw = yaw + self.delay = delay + + return self.target_yaw +end + + +-- global function to set mob yaw +function mobs:yaw(self, yaw, delay, dtime) + set_yaw(self, yaw, delay, dtime) +end From bbcfb3fdb171053e3142854f658860e7693f31d1 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 11:33:09 -0400 Subject: [PATCH 030/176] Randomize walking or standing on spawn in --- mods/ENTITIES/mcl_mobs/api.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 58fee205ff..102e07c7ca 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -373,6 +373,8 @@ end +local state_randomization = {"stand", "walk"} + -- get entity staticdata local mob_staticdata = function(self) @@ -394,7 +396,7 @@ local mob_staticdata = function(self) self.remove_ok = true self.attack = nil self.following = nil - self.state = "stand" + self.state = state_randomization[math.random(1,#state_randomization)] if use_cmi then self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) @@ -1043,6 +1045,8 @@ minetest.register_entity(name, { automatic_face_movement_dir = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 automatic_face_movement_max_rotation_per_sec = 270, --degrees backface_culling = true, + walk_timer = 0, + stand_timer = 0, --end j4i stuff -- MCL2 extensions From 5155d12d05c5b563a78923b3fc02a885cd23fe85 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 14:09:54 -0400 Subject: [PATCH 031/176] Reformat mobs_mcl to api folder for ease of use --- mods/ENTITIES/mcl_mobs/{ => api}/api.lua | 1 - mods/ENTITIES/mcl_mobs/{ => api}/backup_code_api.lua | 0 mods/ENTITIES/mcl_mobs/{ => api}/mount.lua | 0 mods/ENTITIES/mcl_mobs/{ => api}/spawning.lua | 0 mods/ENTITIES/mcl_mobs/init.lua | 8 +++++--- mods/ENTITIES/mcl_mobs/lucky_block.lua | 8 -------- 6 files changed, 5 insertions(+), 12 deletions(-) rename mods/ENTITIES/mcl_mobs/{ => api}/api.lua (99%) rename mods/ENTITIES/mcl_mobs/{ => api}/backup_code_api.lua (100%) rename mods/ENTITIES/mcl_mobs/{ => api}/mount.lua (100%) rename mods/ENTITIES/mcl_mobs/{ => api}/spawning.lua (100%) delete mode 100644 mods/ENTITIES/mcl_mobs/lucky_block.lua diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua similarity index 99% rename from mods/ENTITIES/mcl_mobs/api.lua rename to mods/ENTITIES/mcl_mobs/api/api.lua index 102e07c7ca..7d5bc1fd22 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -564,7 +564,6 @@ local mob_activate = function(self, staticdata, def, dtime) -- set anything changed above self.object:set_properties(self) - set_yaw(self, (math_random(0, 360) - 180) / 180 * math_pi, 6) --update_tag(self) --set_animation(self, "stand") diff --git a/mods/ENTITIES/mcl_mobs/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/api/backup_code_api.lua similarity index 100% rename from mods/ENTITIES/mcl_mobs/backup_code_api.lua rename to mods/ENTITIES/mcl_mobs/api/backup_code_api.lua diff --git a/mods/ENTITIES/mcl_mobs/mount.lua b/mods/ENTITIES/mcl_mobs/api/mount.lua similarity index 100% rename from mods/ENTITIES/mcl_mobs/mount.lua rename to mods/ENTITIES/mcl_mobs/api/mount.lua diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua similarity index 100% rename from mods/ENTITIES/mcl_mobs/spawning.lua rename to mods/ENTITIES/mcl_mobs/api/spawning.lua diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 69246b4706..b0daba2c4b 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -1,14 +1,16 @@ local path = minetest.get_modpath(minetest.get_current_modname()) +local api_path = path.."/api" + -- Mob API -dofile(path .. "/api.lua") +dofile(api_path .. "/api.lua") -- Spawning Algorithm -dofile(path .. "/spawning.lua") +dofile(api_path .. "/spawning.lua") -- Rideable Mobs -dofile(path .. "/mount.lua") +dofile(api_path .. "/mount.lua") -- Mob Items dofile(path .. "/crafts.lua") \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/lucky_block.lua b/mods/ENTITIES/mcl_mobs/lucky_block.lua deleted file mode 100644 index ea90de74ac..0000000000 --- a/mods/ENTITIES/mcl_mobs/lucky_block.lua +++ /dev/null @@ -1,8 +0,0 @@ - -if minetest.get_modpath("lucky_block") then - - lucky_block:add_blocks({ - {"dro", {"mcl_mobs:nametag"}, 1}, - {"lig"}, - }) -end From 6cb6d714c9bcf55213a9449416bec37c0fe318af Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 15:04:55 -0400 Subject: [PATCH 032/176] Reorganize all mob sections into multiple files --- mods/ENTITIES/mcl_mobs/api/api.lua | 1166 +++-------------- .../mcl_mobs/api/mob_functions/ai.lua | 204 +++ .../mcl_mobs/api/mob_functions/animation.lua | 105 ++ .../{ => mob_functions}/backup_code_api.lua | 0 .../mcl_mobs/api/mob_functions/collision.lua | 84 ++ .../api/mob_functions/environment.lua | 12 + .../api/mob_functions/interaction.lua | 39 + .../mcl_mobs/api/mob_functions/movement.lua | 54 + .../mcl_mobs/api/mob_functions/set_up.lua | 215 +++ 9 files changed, 926 insertions(+), 953 deletions(-) create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua rename mods/ENTITIES/mcl_mobs/api/{ => mob_functions}/backup_code_api.lua (100%) create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 7d5bc1fd22..fad7b8c28f 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -1,8 +1,11 @@ -- API for Mobs Redo: MineClone 2 Delux 2.0 DRM Free Early Access Super Extreme Edition --- current state of things: Why? +-- current state of things: How to? --- lua locals +-- mobs library +mobs = {} + +-- lua locals - can grab from this to easily plop them into the api lua files --localize minetest functions local minetest_settings = minetest.settings @@ -46,7 +49,6 @@ local math_floor = math.floor local vector_new = vector.new local vector_length = vector.length -mobs = {} -- mob constants local MAX_MOB_NAME_LENGTH = 30 local BREED_TIME = 30 @@ -142,971 +144,229 @@ if minetest_settings:get_bool("only_peaceful_mobs", false) then end -local integer_test = {-1,1} - -local collision = function(self) - - local pos = self.object:get_pos() - - --do collision detection from the base of the mob - local collisionbox = self.object:get_properties().collisionbox - - pos.y = pos.y + collisionbox[2] - - local collision_boundary = collisionbox[4] - - local radius = collision_boundary - - if collisionbox[5] > collision_boundary then - radius = collisionbox[5] - end - - local collision_count = 0 - - 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()._cmi_is_mob == true) then--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 self.object:get_attach() or (self.object:get_attach() and self.object:get_attach() ~= object)) then - --stop infinite loop - collision_count = collision_count + 1 - if collision_count > 100 then - break - end - - local pos2 = object:get_pos() - - local object_collisionbox = object:get_properties().collisionbox - - pos2.y = pos2.y + object_collisionbox[2] - - local object_collision_boundary = object_collisionbox[4] - - - --this is checking the difference of the object collided with's possision - --if positive top of other object is inside (y axis) of current object - local y_base_diff = (pos2.y + object_collisionbox[5]) - pos.y - - local y_top_diff = (pos.y + collisionbox[5]) - pos2.y - - - local distance = vector.distance(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z)) - - if distance <= collision_boundary + object_collision_boundary and y_base_diff >= 0 and y_top_diff >= 0 then - - 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 - --corner/wall sticking - dir.x = dir.x + ((math_random()/10)*integer_test[math.random(1,2)]) - dir.z = dir.z + ((math_random()/10)*integer_test[math.random(1,2)]) - end - - local velocity = dir - - --0.5 is the max force multiplier - local force = 0.5 - (0.5 * distance / (collision_boundary + object_collision_boundary)) - - local vel1 = vector.multiply(velocity, -1.5) - local vel2 = vector.multiply(velocity, 1.5) - - vel1 = vector.multiply(vel1, force) - vel2 = vector.multiply(vel2, force) - - self.object:add_velocity(vel1) - object:add_velocity(vel2) - end - - end - end -end - - - --- move mob in facing direction ---this has been modified to be internal ---internal = lua (self.yaw) ---engine = c++ (self.object:get_yaw()) -local set_velocity = function(self, v) - - local yaw = (self.yaw or 0) - - local current_velocity = self.object:get_velocity() - - local goal_velocity = { - x = (math_sin(yaw) * -v), - y = 0, - 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))) - end - - new_velocity_addition.y = 0 - - --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then - self.object:add_velocity(new_velocity_addition) - end -end - - - --- calculate mob velocity -local get_velocity = function(self) - - local v = self.object:get_velocity() - - v.y = 0 - - if v then - return vector_length(v) - end - - return 0 -end - --- set defined animation -local set_animation = function(self, anim, fixed_frame) - if not self.animation or not anim then - return - end - if self.state == "die" and anim ~= "die" and anim ~= "stand" then - return - end - - self.animation.current = self.animation.current or "" - - if (anim == self.animation.current - or not self.animation[anim .. "_start"] - or not self.animation[anim .. "_end"]) and self.state ~= "die" then - return - end - - self.animation.current = anim - - local a_start = self.animation[anim .. "_start"] - local a_end - if fixed_frame then - a_end = a_start - else - a_end = self.animation[anim .. "_end"] - end - - self.object:set_animation({ - x = a_start, - y = a_end}, - self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, - 0, self.animation[anim .. "_loop"] ~= false) -end - - --- above function exported for mount.lua -function mobs:set_animation(self, anim) - set_animation(self, anim) -end - -mobs.death_effect = function(pos, yaw, collisionbox, rotate) - local min, max - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - else - min = { x = -0.5, y = 0, z = -0.5 } - 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, max = vector.sort(min, max) - min = vector.multiply(min, 0.5) - max = vector.multiply(max, 0.5) - end - - minetest_add_particlespawner({ - amount = 50, - time = 0.001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector.new(-5,-5,-5), - maxvel = vector.new(5,5,5), - minexptime = 1.1, - maxexptime = 1.5, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_mob_death.png^[colorize:#000000:255", - }) - - minetest_sound_play("mcl_mobs_mob_poof", { - pos = pos, - gain = 1.0, - max_hear_distance = 8, - }, true) -end - - --- execute current state (stand, walk, run, attacks) --- returns true if mob has died -local do_states = function(self, dtime) - local yaw = self.object:get_yaw() or 0 - - self.state_timer = self.state_timer - dtime - - if self.state_timer <= 0 then - self.state_timer = math.random(0,2) + math.random() - --let's do a random state - self.yaw = (math_random() * (math.pi * 2)) - end - - set_velocity(self,1) -end - - - -local state_randomization = {"stand", "walk"} - --- get entity staticdata -local mob_staticdata = function(self) - ---[[ - -- remove mob when out of range unless tamed - if remove_far - and self.can_despawn - and self.remove_ok - and ((not self.nametag) or (self.nametag == "")) - and self.lifetimer <= 20 then - - minetest.log("action", "Mob "..name.." despawns in mob_staticdata at "..minetest.pos_to_string(self.object.get_pos(), 1)) - mcl_burning.extinguish(self.object) - self.object:remove() - - return ""-- nil - end ---]] - self.remove_ok = true - self.attack = nil - self.following = nil - self.state = state_randomization[math.random(1,#state_randomization)] - - if use_cmi then - self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) - end - - local tmp = {} - - for _,stat in pairs(self) do - - local t = type(stat) - - if t ~= "function" - and t ~= "nil" - and t ~= "userdata" - and _ ~= "_cmi_components" then - tmp[_] = self[_] - end - end - - return minetest.serialize(tmp) -end - - --- activate mob and reload settings -local mob_activate = function(self, staticdata, def, dtime) - - -- remove monsters in peaceful mode - if self.type == "monster" - and minetest_settings:get_bool("only_peaceful_mobs", false) then - mcl_burning.extinguish(self.object) - self.object:remove() - - return - end - - -- load entity variables - local tmp = minetest.deserialize(staticdata) - - if tmp then - for _,stat in pairs(tmp) do - self[_] = stat - end - end - - -- select random texture, set model and size - if not self.base_texture then - - -- compatiblity with old simple mobs textures - if type(def.textures[1]) == "string" then - def.textures = {def.textures} - end - - self.base_texture = def.textures[math_random(1, #def.textures)] - self.base_mesh = def.mesh - self.base_size = self.visual_size - self.base_colbox = self.collisionbox - self.base_selbox = self.selectionbox - end - - -- for current mobs that dont have this set - if not self.base_selbox then - self.base_selbox = self.selectionbox or self.base_colbox - end - - -- set texture, model and size - local textures = self.base_texture - local mesh = self.base_mesh - local vis_size = self.base_size - local colbox = self.base_colbox - local selbox = self.base_selbox - - -- specific texture if gotten - if self.gotten == true - and def.gotten_texture then - textures = def.gotten_texture - end - - -- specific mesh if gotten - if self.gotten == true - and def.gotten_mesh then - mesh = def.gotten_mesh - end - - -- set child objects to half size - if self.child == true then - - vis_size = { - x = self.base_size.x * .5, - y = self.base_size.y * .5, - } - - if def.child_texture then - textures = def.child_texture[1] - end - - colbox = { - self.base_colbox[1] * .5, - self.base_colbox[2] * .5, - self.base_colbox[3] * .5, - self.base_colbox[4] * .5, - self.base_colbox[5] * .5, - self.base_colbox[6] * .5 - } - selbox = { - self.base_selbox[1] * .5, - self.base_selbox[2] * .5, - self.base_selbox[3] * .5, - self.base_selbox[4] * .5, - self.base_selbox[5] * .5, - self.base_selbox[6] * .5 - } - end - - if self.health == 0 then - self.health = math_random (self.hp_min, self.hp_max) - end - if self.breath == nil then - self.breath = self.breath_max - end - - -- pathfinding init - self.path = {} - self.path.way = {} -- path to follow, table of positions - self.path.lastpos = {x = 0, y = 0, z = 0} - self.path.stuck = false - self.path.following = false -- currently following path? - self.path.stuck_timer = 0 -- if stuck for too long search for path - - -- Armor groups - -- immortal=1 because we use custom health - -- handling (using "health" property) - local armor - if type(self.armor) == "table" then - armor = table.copy(self.armor) - armor.immortal = 1 - else - armor = {immortal=1, fleshy = self.armor} - end - self.object:set_armor_groups(armor) - self.old_y = self.object:get_pos().y - self.old_health = self.health - self.sounds.distance = self.sounds.distance or 10 - self.textures = textures - self.mesh = mesh - self.collisionbox = colbox - self.selectionbox = selbox - self.visual_size = vis_size - self.standing_in = "ignore" - self.standing_on = "ignore" - self.jump_sound_cooloff = 0 -- used to prevent jump sound from being played too often in short time - self.opinion_sound_cooloff = 0 -- used to prevent sound spam of particular sound types - - self.texture_mods = {} - self.object:set_texture_mod("") - - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.blinkstatus = false - - -- check existing nametag - if not self.nametag then - self.nametag = def.nametag - end - - -- set anything changed above - self.object:set_properties(self) - - --update_tag(self) - --set_animation(self, "stand") - - -- run on_spawn function if found - if self.on_spawn and not self.on_spawn_run then - if self.on_spawn(self) then - self.on_spawn_run = true -- if true, set flag to run once only - end - end - - -- run after_activate - if def.after_activate then - def.after_activate(self, staticdata, def, dtime) - end - - if use_cmi then - self._cmi_components = cmi.activate_components(self.serialized_cmi_components) - cmi.notify_activate(self.object, dtime) - end -end - - ---this allows auto facedir rotation while making it so mobs ---don't look like wet noodles flopping around -local movement_rotation_lock = function(self) - - local current_engine_yaw = self.object:get_yaw() - local current_lua_yaw = self.yaw - - if current_engine_yaw > math.pi * 2 then - current_engine_yaw = current_engine_yaw - (math.pi * 2) - end - - if math.abs(current_engine_yaw - current_lua_yaw) <= 0.05 and self.object:get_properties().automatic_face_movement_dir then - self.object:set_properties{automatic_face_movement_dir = false} - elseif math.abs(current_engine_yaw - current_lua_yaw) > 0.05 and self.object:get_properties().automatic_face_movement_dir == false then - self.object:set_properties{automatic_face_movement_dir = self.rotate} - end -end - - -local mob_step = function(self, dtime) - - --do not continue if non-existent - if not self or not self.object or not self.object:get_luaentity() then - return false - end - - --print(self.object:get_yaw()) - - --if self.state == "die" then - -- print("need custom die stop moving thing") - -- return - --end - - - - - - do_states(self, dtime) - - - movement_rotation_lock(self) - - -- can mob be pushed, if so calculate direction -- do this last (overrides everything) - if self.pushable then - collision(self) - end - - - --if not self.fire_resistant then - -- mcl_burning.tick(self.object, dtime) - --end - - --if use_cmi then - --cmi.notify_step(self.object, dtime) - --end - - --local pos = self.object:get_pos() - --local yaw = 0 - - --if mobs_debug then - --update_tag(self) - --end - - - - --if self.jump_sound_cooloff > 0 then - -- self.jump_sound_cooloff = self.jump_sound_cooloff - dtime - --end - - --if self.opinion_sound_cooloff > 0 then - -- self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime - --end - - --if falling(self, pos) then - -- Return if mob died after falling - -- return - --end - - - -- run custom function (defined in mob lua file) - --if self.do_custom then - - -- when false skip going any further - --if self.do_custom(self, dtime) == false then - -- return - --end - --end - - -- knockback timer - --if self.pause_timer > 0 then - - -- self.pause_timer = self.pause_timer - dtime - - -- return - --end - - -- attack timer - --self.timer = self.timer + dtime - - --[[ - if self.state ~= "attack" then - - if self.timer < 1 then - print("returning>>error code 1") - return - end - - self.timer = 0 - end - ]]-- - - -- never go over 100 - --if self.timer > 100 then - -- self.timer = 1 - --end - - -- mob plays random sound at times - --if math_random(1, 70) == 1 then - -- mob_sound(self, "random", true) - --end - - -- environmental damage timer (every 1 second) - --self.env_damage_timer = self.env_damage_timer + dtime - - --if (self.state == "attack" and self.env_damage_timer > 1) - --or self.state ~= "attack" then - -- - -- self.env_damage_timer = 0 - -- - -- -- check for environmental damage (water, fire, lava etc.) - -- if do_env_damage(self) then - -- return - -- end - -- - -- node replace check (cow eats grass etc.) - -- replace(self, pos) - --end - - --monster_attack(self) - - --npc_attack(self) - - --breed(self) - - --do_jump(self) - - --runaway_from(self) - - - --if is_at_water_danger(self) and self.state ~= "attack" 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 = set_yaw(self, yaw, 8) - -- end - --end - - - -- Add water flowing for mobs from mcl_item_entity - --[[ - local p, node, nn, def - p = self.object:get_pos() - node = minetest_get_node_or_nil(p) - if node then - nn = node.name - def = minetest_registered_nodes[nnenable_physicss if not on/in flowing liquid - self._flowing = false - enable_physics(self.object, self, true) - return - end - - --Mob following code. - follow_flop(self) - - - if is_at_cliff_or_danger(self) then - set_velocity(self, 0) - self.state = "stand" - set_animation(self, "stand") - local yaw = self.object:get_yaw() or 0 - yaw = set_yaw(self, yaw + 0.78, 8) - end - - -- Despawning: when lifetimer expires, remove mob - if remove_far - and self.can_despawn == true - and ((not self.nametag) or (self.nametag == "")) - and self.state ~= "attack" - and self.following == nil then - - self.lifetimer = self.lifetimer - dtime - if self.despawn_immediately or self.lifetimer <= 0 then - minetest.log("action", "Mob "..self.name.." despawns in mob_step at "..minetest.pos_to_string(pos, 1)) - mcl_burning.extinguish(self.object) - self.object:remove() - elseif self.lifetimer <= 10 then - if math_random(10) < 4 then - self.despawn_immediately = true - else - self.lifetimer = 20 - end - end - end - ]]-- -end - - --- default function when mobs are blown up with TNT -local do_tnt = function(obj, damage) - - obj.object:punch(obj.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, nil) - - return false, true, {} -end +local api_path = minetest.get_modpath(minetest.get_current_modname()).."/api/mob_functions/" + +--ignite all parts of the api +dofile(api_path .. "ai.lua") +dofile(api_path .. "animation.lua") +dofile(api_path .. "collision.lua") +dofile(api_path .. "environment.lua") +dofile(api_path .. "interaction.lua") +dofile(api_path .. "movement.lua") +dofile(api_path .. "set_up.lua") mobs.spawning_mobs = {} --- Code to execute before custom on_rightclick handling -local on_rightclick_prefix = function(self, clicker) - local item = clicker:get_wielded_item() - -- Name mob with nametag - if not self.ignores_nametag and item:get_name() == "mcl_mobs:nametag" then - local tag = item:get_meta():get_string("name") - if tag ~= "" then - if string.len(tag) > MAX_MOB_NAME_LENGTH then - tag = string.sub(tag, 1, MAX_MOB_NAME_LENGTH) - end - self.nametag = tag - - update_tag(self) - - if not mobs.is_creative(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - end - return true - end - - end - return false -end - -local create_mob_on_rightclick = function(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 -- register mob entity function mobs:register_mob(name, def) + local collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25} + + -- Workaround for : + -- Increase upper Y limit to avoid mobs glitching through solid nodes. + -- FIXME: Remove workaround if it's no longer needed. + + if collisionbox[5] < 0.79 then + collisionbox[5] = 0.79 + end + mobs.spawning_mobs[name] = true -local can_despawn -if def.can_despawn ~= nil then - can_despawn = def.can_despawn -elseif def.spawn_class == "passive" then - can_despawn = false -else - can_despawn = true -end - -local function scale_difficulty(value, default, min, special) - if (not value) or (value == default) or (value == special) then - return default + local can_despawn + if def.can_despawn ~= nil then + can_despawn = def.can_despawn + elseif def.spawn_class == "passive" then + can_despawn = false else - return math_max(min, value * difficulty) + can_despawn = true end -end -local collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25} --- Workaround for : --- Increase upper Y limit to avoid mobs glitching through solid nodes. --- FIXME: Remove workaround if it's no longer needed. -if collisionbox[5] < 0.79 then - collisionbox[5] = 0.79 -end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -minetest.register_entity(name, { - - use_texture_alpha = def.use_texture_alpha, - stepheight = def.stepheight or 0.6, - name = name, - type = def.type, - attack_type = def.attack_type, - fly = def.fly, - fly_in = def.fly_in or {"air", "__airlike"}, - owner = def.owner or "", - order = def.order or "", - on_die = def.on_die, - spawn_small_alternative = def.spawn_small_alternative, - do_custom = def.do_custom, - jump_height = def.jump_height or 4, -- was 6 - rotate = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 - lifetimer = def.lifetimer or 57.73, - hp_min = scale_difficulty(def.hp_min, 5, 1), - hp_max = scale_difficulty(def.hp_max, 10, 1), - xp_min = def.xp_min or 0, - xp_max = def.xp_max or 0, - xp_timestamp = 0, - breath_max = def.breath_max or 15, - breathes_in_water = def.breathes_in_water or false, - physical = true, - collisionbox = collisionbox, - selectionbox = def.selectionbox or def.collisionbox, - visual = def.visual, - visual_size = def.visual_size or {x = 1, y = 1}, - mesh = def.mesh, - makes_footstep_sound = def.makes_footstep_sound or false, - view_range = def.view_range or 16, - walk_velocity = def.walk_velocity or 1, - run_velocity = def.run_velocity or 2, - damage = scale_difficulty(def.damage, 0, 0), - light_damage = def.light_damage or 0, - sunlight_damage = def.sunlight_damage or 0, - water_damage = def.water_damage or 0, - lava_damage = def.lava_damage or 8, - fire_damage = def.fire_damage or 1, - suffocation = def.suffocation or true, - fall_damage = def.fall_damage or 1, - fall_speed = def.fall_speed or DEFAULT_FALL_SPEED, -- must be lower than -2 - drops = def.drops or {}, - armor = def.armor or 100, - on_rightclick = create_mob_on_rightclick(def.on_rightclick), - arrow = def.arrow, - shoot_interval = def.shoot_interval, - sounds = def.sounds or {}, - animation = def.animation, - follow = def.follow, - jump = def.jump ~= false, - walk_chance = def.walk_chance or 50, - attacks_monsters = def.attacks_monsters or false, - group_attack = def.group_attack or false, - passive = def.passive or false, - knock_back = def.knock_back ~= false, - shoot_offset = def.shoot_offset or 0, - floats = def.floats or 1, -- floats in water by default - floats_on_lava = def.floats_on_lava or 0, - replace_rate = def.replace_rate, - replace_what = def.replace_what, - replace_with = def.replace_with, - replace_offset = def.replace_offset or 0, - on_replace = def.on_replace, - timer = 0, - state_timer = 0, - env_damage_timer = 0, - tamed = false, - pause_timer = 0, - horny = false, - hornytimer = 0, - gotten = false, - health = 0, - reach = def.reach or 3, - htimer = 0, - texture_list = def.textures, - child_texture = def.child_texture, - docile_by_day = def.docile_by_day or false, - time_of_day = 0.5, - fear_height = def.fear_height or 0, - runaway = def.runaway, - runaway_timer = 0, - pathfinding = def.pathfinding, - immune_to = def.immune_to or {}, - explosion_radius = def.explosion_radius, -- LEGACY - explosion_damage_radius = def.explosion_damage_radius, -- LEGACY - explosiontimer_reset_radius = def.explosiontimer_reset_radius, - explosion_timer = def.explosion_timer or 3, - allow_fuse_reset = def.allow_fuse_reset ~= false, - stop_to_explode = def.stop_to_explode ~= false, - custom_attack = def.custom_attack, - double_melee_attack = def.double_melee_attack, - dogshoot_switch = def.dogshoot_switch, - dogshoot_count = 0, - dogshoot_count_max = def.dogshoot_count_max or 5, - dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5), - attack_animals = def.attack_animals or false, - specific_attack = def.specific_attack, - runaway_from = def.runaway_from, - owner_loyal = def.owner_loyal, - facing_fence = false, - _cmi_is_mob = true, - pushable = def.pushable or true, - - --j4i stuff - --automatic_rotate = 360, - yaw = 0, - automatic_face_movement_dir = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 - automatic_face_movement_max_rotation_per_sec = 270, --degrees - backface_culling = true, - walk_timer = 0, - stand_timer = 0, - --end j4i stuff - - -- MCL2 extensions - teleport = teleport, - do_teleport = def.do_teleport, - spawn_class = def.spawn_class, - ignores_nametag = def.ignores_nametag or false, - rain_damage = def.rain_damage or 0, - glow = def.glow, - can_despawn = can_despawn, - child = def.child or false, - texture_mods = {}, - shoot_arrow = def.shoot_arrow, - sounds_child = def.sounds_child, - explosion_strength = def.explosion_strength, - suffocation_timer = 0, - follow_velocity = def.follow_velocity or 2.4, - instant_death = def.instant_death or false, - fire_resistant = def.fire_resistant or false, - fire_damage_resistant = def.fire_damage_resistant or false, - ignited_by_sunlight = def.ignited_by_sunlight or false, - -- End of MCL2 extensions - - on_spawn = def.on_spawn, - - on_blast = def.on_blast or do_tnt, - - on_step = mob_step, - - do_punch = def.do_punch, - - on_punch = mob_punch, - - on_breed = def.on_breed, - - on_grown = def.on_grown, - - on_detach_child = mob_detach_child, - - on_activate = function(self, staticdata, dtime) - --this is a temporary hack so mobs stop - --glitching and acting really weird with the - --default built in engine collision detection - self.object:set_properties({ - collide_with_objects = false, - }) - self.object:set_acceleration(vector_new(0,-9.81, 0)) - return mob_activate(self, staticdata, def, dtime) - end, - - get_staticdata = function(self) - return mob_staticdata(self) - end, - - harmed_by_heal = def.harmed_by_heal, - -}) - -if minetest_get_modpath("doc_identifier") ~= nil then - doc.sub.identifier.register_object(name, "basics", "mobs") -end + local function scale_difficulty(value, default, min, special) + if (not value) or (value == default) or (value == special) then + return default + else + return math_max(min, value * difficulty) + end + end + + minetest.register_entity(name, { + + use_texture_alpha = def.use_texture_alpha, + stepheight = def.stepheight or 0.6, + name = name, + type = def.type, + attack_type = def.attack_type, + fly = def.fly, + fly_in = def.fly_in or {"air", "__airlike"}, + owner = def.owner or "", + order = def.order or "", + on_die = def.on_die, + spawn_small_alternative = def.spawn_small_alternative, + do_custom = def.do_custom, + jump_height = def.jump_height or 4, -- was 6 + rotate = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 + lifetimer = def.lifetimer or 57.73, + hp_min = scale_difficulty(def.hp_min, 5, 1), + hp_max = scale_difficulty(def.hp_max, 10, 1), + xp_min = def.xp_min or 0, + xp_max = def.xp_max or 0, + xp_timestamp = 0, + breath_max = def.breath_max or 15, + breathes_in_water = def.breathes_in_water or false, + physical = true, + collisionbox = collisionbox, + selectionbox = def.selectionbox or def.collisionbox, + visual = def.visual, + visual_size = def.visual_size or {x = 1, y = 1}, + mesh = def.mesh, + makes_footstep_sound = def.makes_footstep_sound or false, + view_range = def.view_range or 16, + walk_velocity = def.walk_velocity or 1, + run_velocity = def.run_velocity or 2, + damage = scale_difficulty(def.damage, 0, 0), + light_damage = def.light_damage or 0, + sunlight_damage = def.sunlight_damage or 0, + water_damage = def.water_damage or 0, + lava_damage = def.lava_damage or 8, + fire_damage = def.fire_damage or 1, + suffocation = def.suffocation or true, + fall_damage = def.fall_damage or 1, + fall_speed = def.fall_speed or DEFAULT_FALL_SPEED, -- must be lower than -2 + drops = def.drops or {}, + armor = def.armor or 100, + on_rightclick = mobs.create_mob_on_rightclick(def.on_rightclick), + arrow = def.arrow, + shoot_interval = def.shoot_interval, + sounds = def.sounds or {}, + animation = def.animation, + follow = def.follow, + jump = def.jump ~= false, + walk_chance = def.walk_chance or 50, + attacks_monsters = def.attacks_monsters or false, + group_attack = def.group_attack or false, + passive = def.passive or false, + knock_back = def.knock_back ~= false, + shoot_offset = def.shoot_offset or 0, + floats = def.floats or 1, -- floats in water by default + floats_on_lava = def.floats_on_lava or 0, + replace_rate = def.replace_rate, + replace_what = def.replace_what, + replace_with = def.replace_with, + replace_offset = def.replace_offset or 0, + on_replace = def.on_replace, + timer = 0, + state_timer = 0, + env_damage_timer = 0, + tamed = false, + pause_timer = 0, + horny = false, + hornytimer = 0, + gotten = false, + health = 0, + reach = def.reach or 3, + htimer = 0, + texture_list = def.textures, + child_texture = def.child_texture, + docile_by_day = def.docile_by_day or false, + time_of_day = 0.5, + fear_height = def.fear_height or 0, + runaway = def.runaway, + runaway_timer = 0, + pathfinding = def.pathfinding, + immune_to = def.immune_to or {}, + explosion_radius = def.explosion_radius, -- LEGACY + explosion_damage_radius = def.explosion_damage_radius, -- LEGACY + explosiontimer_reset_radius = def.explosiontimer_reset_radius, + explosion_timer = def.explosion_timer or 3, + allow_fuse_reset = def.allow_fuse_reset ~= false, + stop_to_explode = def.stop_to_explode ~= false, + custom_attack = def.custom_attack, + double_melee_attack = def.double_melee_attack, + dogshoot_switch = def.dogshoot_switch, + dogshoot_count = 0, + dogshoot_count_max = def.dogshoot_count_max or 5, + dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5), + attack_animals = def.attack_animals or false, + specific_attack = def.specific_attack, + runaway_from = def.runaway_from, + owner_loyal = def.owner_loyal, + facing_fence = false, + _cmi_is_mob = true, + pushable = def.pushable or true, + + --j4i stuff + --automatic_rotate = 360, + yaw = 0, + automatic_face_movement_dir = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 + automatic_face_movement_max_rotation_per_sec = 270, --degrees + backface_culling = true, + walk_timer = 0, + stand_timer = 0, + --end j4i stuff + + -- MCL2 extensions + teleport = teleport, + do_teleport = def.do_teleport, + spawn_class = def.spawn_class, + ignores_nametag = def.ignores_nametag or false, + rain_damage = def.rain_damage or 0, + glow = def.glow, + can_despawn = can_despawn, + child = def.child or false, + texture_mods = {}, + shoot_arrow = def.shoot_arrow, + sounds_child = def.sounds_child, + explosion_strength = def.explosion_strength, + suffocation_timer = 0, + follow_velocity = def.follow_velocity or 2.4, + instant_death = def.instant_death or false, + fire_resistant = def.fire_resistant or false, + fire_damage_resistant = def.fire_damage_resistant or false, + ignited_by_sunlight = def.ignited_by_sunlight or false, + -- End of MCL2 extensions + + on_spawn = def.on_spawn, + + on_blast = def.on_blast or do_tnt, + + on_step = mobs.mob_step, + + do_punch = def.do_punch, + + on_punch = mob_punch, + + on_breed = def.on_breed, + + on_grown = def.on_grown, + + on_detach_child = mob_detach_child, + + on_activate = function(self, staticdata, dtime) + --this is a temporary hack so mobs stop + --glitching and acting really weird with the + --default built in engine collision detection + self.object:set_properties({ + collide_with_objects = false, + }) + self.object:set_acceleration(vector_new(0,-9.81, 0)) + return mobs.mob_activate(self, staticdata, def, dtime) + end, + + get_staticdata = function(self) + return mobs.mob_staticdata(self) + end, + + harmed_by_heal = def.harmed_by_heal, + + }) + + if minetest_get_modpath("doc_identifier") ~= nil then + doc.sub.identifier.register_object(name, "basics", "mobs") + end end -- END mobs:register_mob function diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua new file mode 100644 index 0000000000..1a3066b971 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -0,0 +1,204 @@ +local math_random = math.random + +-- execute current state (stand, walk, run, attacks) +-- returns true if mob has died +local do_states = function(self, dtime) + local yaw = self.object:get_yaw() or 0 + + self.state_timer = self.state_timer - dtime + + if self.state_timer <= 0 then + self.state_timer = math.random(0,2) + math.random() + --let's do a random state + self.yaw = (math_random() * (math.pi * 2)) + end + + mobs.set_velocity(self,1) +end + + +mobs.mob_step = function(self, dtime) + + --do not continue if non-existent + if not self or not self.object or not self.object:get_luaentity() then + return false + end + + --print(self.object:get_yaw()) + + --if self.state == "die" then + -- print("need custom die stop moving thing") + -- return + --end + + + do_states(self, dtime) + + + mobs.movement_rotation_lock(self) + + -- can mob be pushed, if so calculate direction -- do this last (overrides everything) + if self.pushable then + mobs.collision(self) + end + + + --if not self.fire_resistant then + -- mcl_burning.tick(self.object, dtime) + --end + + --if use_cmi then + --cmi.notify_step(self.object, dtime) + --end + + --local pos = self.object:get_pos() + --local yaw = 0 + + --if mobs_debug then + --update_tag(self) + --end + + + + --if self.jump_sound_cooloff > 0 then + -- self.jump_sound_cooloff = self.jump_sound_cooloff - dtime + --end + + --if self.opinion_sound_cooloff > 0 then + -- self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime + --end + + --if falling(self, pos) then + -- Return if mob died after falling + -- return + --end + + + -- run custom function (defined in mob lua file) + --if self.do_custom then + + -- when false skip going any further + --if self.do_custom(self, dtime) == false then + -- return + --end + --end + + -- knockback timer + --if self.pause_timer > 0 then + + -- self.pause_timer = self.pause_timer - dtime + + -- return + --end + + -- attack timer + --self.timer = self.timer + dtime + + --[[ + if self.state ~= "attack" then + + if self.timer < 1 then + print("returning>>error code 1") + return + end + + self.timer = 0 + end + ]]-- + + -- never go over 100 + --if self.timer > 100 then + -- self.timer = 1 + --end + + -- mob plays random sound at times + --if math_random(1, 70) == 1 then + -- mob_sound(self, "random", true) + --end + + -- environmental damage timer (every 1 second) + --self.env_damage_timer = self.env_damage_timer + dtime + + --if (self.state == "attack" and self.env_damage_timer > 1) + --or self.state ~= "attack" then + -- + -- self.env_damage_timer = 0 + -- + -- -- check for environmental damage (water, fire, lava etc.) + -- if do_env_damage(self) then + -- return + -- end + -- + -- node replace check (cow eats grass etc.) + -- replace(self, pos) + --end + + --monster_attack(self) + + --npc_attack(self) + + --breed(self) + + --do_jump(self) + + --runaway_from(self) + + + --if is_at_water_danger(self) and self.state ~= "attack" 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 = set_yaw(self, yaw, 8) + -- end + --end + + + -- Add water flowing for mobs from mcl_item_entity + --[[ + local p, node, nn, def + p = self.object:get_pos() + node = minetest_get_node_or_nil(p) + if node then + nn = node.name + def = minetest_registered_nodes[nnenable_physicss if not on/in flowing liquid + self._flowing = false + enable_physics(self.object, self, true) + return + end + + --Mob following code. + follow_flop(self) + + + if is_at_cliff_or_danger(self) then + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + local yaw = self.object:get_yaw() or 0 + yaw = set_yaw(self, yaw + 0.78, 8) + end + + -- Despawning: when lifetimer expires, remove mob + if remove_far + and self.can_despawn == true + and ((not self.nametag) or (self.nametag == "")) + and self.state ~= "attack" + and self.following == nil then + + self.lifetimer = self.lifetimer - dtime + if self.despawn_immediately or self.lifetimer <= 0 then + minetest.log("action", "Mob "..self.name.." despawns in mob_step at "..minetest.pos_to_string(pos, 1)) + mcl_burning.extinguish(self.object) + self.object:remove() + elseif self.lifetimer <= 10 then + if math_random(10) < 4 then + self.despawn_immediately = true + else + self.lifetimer = 20 + end + 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 new file mode 100644 index 0000000000..8de235ab76 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -0,0 +1,105 @@ +local math_pi = math.pi +local math_sin = math.sin +local math_cos = math.cos + +-- set defined animation +local set_animation = function(self, anim, fixed_frame) + if not self.animation or not anim then + return + end + if self.state == "die" and anim ~= "die" and anim ~= "stand" then + return + end + + self.animation.current = self.animation.current or "" + + if (anim == self.animation.current + or not self.animation[anim .. "_start"] + or not self.animation[anim .. "_end"]) and self.state ~= "die" then + return + end + + self.animation.current = anim + + local a_start = self.animation[anim .. "_start"] + local a_end + if fixed_frame then + a_end = a_start + else + a_end = self.animation[anim .. "_end"] + end + + self.object:set_animation({ + x = a_start, + y = a_end}, + self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, + 0, self.animation[anim .. "_loop"] ~= false) +end + + +-- above function exported for mount.lua +function mobs:set_animation(self, anim) + set_animation(self, anim) +end + + + + +mobs.death_effect = function(pos, yaw, collisionbox, rotate) + local min, max + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + else + min = { x = -0.5, y = 0, z = -0.5 } + 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, max = vector.sort(min, max) + min = vector.multiply(min, 0.5) + max = vector.multiply(max, 0.5) + end + + minetest_add_particlespawner({ + amount = 50, + time = 0.001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-5,-5,-5), + maxvel = vector.new(5,5,5), + minexptime = 1.1, + maxexptime = 1.5, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_mob_death.png^[colorize:#000000:255", + }) + + minetest_sound_play("mcl_mobs_mob_poof", { + pos = pos, + gain = 1.0, + max_hear_distance = 8, + }, true) +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 + + if current_engine_yaw > math.pi * 2 then + current_engine_yaw = current_engine_yaw - (math.pi * 2) + end + + if math.abs(current_engine_yaw - current_lua_yaw) <= 0.05 and self.object:get_properties().automatic_face_movement_dir then + self.object:set_properties{automatic_face_movement_dir = false} + elseif math.abs(current_engine_yaw - current_lua_yaw) > 0.05 and self.object:get_properties().automatic_face_movement_dir == false then + self.object:set_properties{automatic_face_movement_dir = self.rotate} + end +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua similarity index 100% rename from mods/ENTITIES/mcl_mobs/api/backup_code_api.lua rename to mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua new file mode 100644 index 0000000000..525dcfd6a5 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua @@ -0,0 +1,84 @@ +local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius + +local integer_test = {-1,1} + +mobs.collision = function(self) + + local pos = self.object:get_pos() + + --do collision detection from the base of the mob + local collisionbox = self.object:get_properties().collisionbox + + pos.y = pos.y + collisionbox[2] + + local collision_boundary = collisionbox[4] + + local radius = collision_boundary + + if collisionbox[5] > collision_boundary then + radius = collisionbox[5] + end + + local collision_count = 0 + + 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()._cmi_is_mob == true) then--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 self.object:get_attach() or (self.object:get_attach() and self.object:get_attach() ~= object)) then + --stop infinite loop + collision_count = collision_count + 1 + if collision_count > 100 then + break + end + + local pos2 = object:get_pos() + + local object_collisionbox = object:get_properties().collisionbox + + pos2.y = pos2.y + object_collisionbox[2] + + local object_collision_boundary = object_collisionbox[4] + + + --this is checking the difference of the object collided with's possision + --if positive top of other object is inside (y axis) of current object + local y_base_diff = (pos2.y + object_collisionbox[5]) - pos.y + + local y_top_diff = (pos.y + collisionbox[5]) - pos2.y + + + local distance = vector.distance(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z)) + + if distance <= collision_boundary + object_collision_boundary and y_base_diff >= 0 and y_top_diff >= 0 then + + 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 + --corner/wall sticking + dir.x = dir.x + ((math_random()/10)*integer_test[math.random(1,2)]) + dir.z = dir.z + ((math_random()/10)*integer_test[math.random(1,2)]) + end + + local velocity = dir + + --0.5 is the max force multiplier + local force = 0.5 - (0.5 * distance / (collision_boundary + object_collision_boundary)) + + local vel1 = vector.multiply(velocity, -1.5) + local vel2 = vector.multiply(velocity, 1.5) + + vel1 = vector.multiply(vel1, force) + vel2 = vector.multiply(vel2, force) + + self.object:add_velocity(vel1) + object:add_velocity(vel2) + end + + end + end +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua new file mode 100644 index 0000000000..082e88543f --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -0,0 +1,12 @@ +-- default function when mobs are blown up with TNT +local do_tnt = function(obj, damage) + + obj.object:punch(obj.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + + return false, true, {} +end + + diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua new file mode 100644 index 0000000000..b996867cf8 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -0,0 +1,39 @@ +-- Code to execute before custom on_rightclick handling +local on_rightclick_prefix = function(self, clicker) + local item = clicker:get_wielded_item() + + -- Name mob with nametag + if not self.ignores_nametag and item:get_name() == "mcl_mobs:nametag" then + + local tag = item:get_meta():get_string("name") + if tag ~= "" then + if string.len(tag) > MAX_MOB_NAME_LENGTH then + tag = string.sub(tag, 1, MAX_MOB_NAME_LENGTH) + end + self.nametag = tag + + update_tag(self) + + if not mobs.is_creative(clicker:get_player_name()) then + item:take_item() + clicker:set_wielded_item(item) + end + return true + end + + end + return false +end + +mobs.create_mob_on_rightclick = function(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 + +mobs.feed_tame = function(self) + return nil +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua new file mode 100644 index 0000000000..8fb30f76a5 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -0,0 +1,54 @@ +local math_pi = math.pi +local math_sin = math.sin +local math_cos = math.cos + +-- localize vector functions +local vector_new = vector.new +local vector_length = vector.length + +-- move mob in facing direction +--this has been modified to be internal +--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() + + local goal_velocity = { + x = (math_sin(yaw) * -v), + y = 0, + 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))) + end + + new_velocity_addition.y = 0 + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + + + +-- calculate mob velocity +mobs.get_velocity = function(self) + + local v = self.object:get_velocity() + + v.y = 0 + + if v then + return vector_length(v) + end + + return 0 +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua new file mode 100644 index 0000000000..87e1fb8df1 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -0,0 +1,215 @@ +local math_random = math.random + + +local state_randomization = {"stand", "walk"} + +-- get entity staticdata +mobs.mob_staticdata = function(self) + +--[[ + -- remove mob when out of range unless tamed + if remove_far + and self.can_despawn + and self.remove_ok + and ((not self.nametag) or (self.nametag == "")) + and self.lifetimer <= 20 then + + minetest.log("action", "Mob "..name.." despawns in mob_staticdata at "..minetest.pos_to_string(self.object.get_pos(), 1)) + mcl_burning.extinguish(self.object) + self.object:remove() + + return ""-- nil + end +--]] + self.remove_ok = true + self.attack = nil + self.following = nil + self.state = state_randomization[math.random(1,#state_randomization)] + + if use_cmi then + self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) + end + + local tmp = {} + + for _,stat in pairs(self) do + + local t = type(stat) + + if t ~= "function" + and t ~= "nil" + and t ~= "userdata" + and _ ~= "_cmi_components" then + tmp[_] = self[_] + end + end + + return minetest.serialize(tmp) +end + + +-- activate mob and reload settings +mobs.mob_activate = function(self, staticdata, def, dtime) + + -- remove monsters in peaceful mode + if self.type == "monster" + and minetest_settings:get_bool("only_peaceful_mobs", false) then + mcl_burning.extinguish(self.object) + self.object:remove() + + return + end + + -- load entity variables + local tmp = minetest.deserialize(staticdata) + + if tmp then + for _,stat in pairs(tmp) do + self[_] = stat + end + end + + -- select random texture, set model and size + if not self.base_texture then + + -- compatiblity with old simple mobs textures + if type(def.textures[1]) == "string" then + def.textures = {def.textures} + end + + self.base_texture = def.textures[math_random(1, #def.textures)] + self.base_mesh = def.mesh + self.base_size = self.visual_size + self.base_colbox = self.collisionbox + self.base_selbox = self.selectionbox + end + + -- for current mobs that dont have this set + if not self.base_selbox then + self.base_selbox = self.selectionbox or self.base_colbox + end + + -- set texture, model and size + local textures = self.base_texture + local mesh = self.base_mesh + local vis_size = self.base_size + local colbox = self.base_colbox + local selbox = self.base_selbox + + -- specific texture if gotten + if self.gotten == true + and def.gotten_texture then + textures = def.gotten_texture + end + + -- specific mesh if gotten + if self.gotten == true + and def.gotten_mesh then + mesh = def.gotten_mesh + end + + -- set child objects to half size + if self.child == true then + + vis_size = { + x = self.base_size.x * .5, + y = self.base_size.y * .5, + } + + if def.child_texture then + textures = def.child_texture[1] + end + + colbox = { + self.base_colbox[1] * .5, + self.base_colbox[2] * .5, + self.base_colbox[3] * .5, + self.base_colbox[4] * .5, + self.base_colbox[5] * .5, + self.base_colbox[6] * .5 + } + selbox = { + self.base_selbox[1] * .5, + self.base_selbox[2] * .5, + self.base_selbox[3] * .5, + self.base_selbox[4] * .5, + self.base_selbox[5] * .5, + self.base_selbox[6] * .5 + } + end + + if self.health == 0 then + self.health = math_random (self.hp_min, self.hp_max) + end + if self.breath == nil then + self.breath = self.breath_max + end + + -- pathfinding init + self.path = {} + self.path.way = {} -- path to follow, table of positions + self.path.lastpos = {x = 0, y = 0, z = 0} + self.path.stuck = false + self.path.following = false -- currently following path? + self.path.stuck_timer = 0 -- if stuck for too long search for path + + -- Armor groups + -- immortal=1 because we use custom health + -- handling (using "health" property) + local armor + if type(self.armor) == "table" then + armor = table.copy(self.armor) + armor.immortal = 1 + else + armor = {immortal=1, fleshy = self.armor} + end + self.object:set_armor_groups(armor) + self.old_y = self.object:get_pos().y + self.old_health = self.health + self.sounds.distance = self.sounds.distance or 10 + self.textures = textures + self.mesh = mesh + self.collisionbox = colbox + self.selectionbox = selbox + self.visual_size = vis_size + self.standing_in = "ignore" + self.standing_on = "ignore" + self.jump_sound_cooloff = 0 -- used to prevent jump sound from being played too often in short time + self.opinion_sound_cooloff = 0 -- used to prevent sound spam of particular sound types + + self.texture_mods = {} + self.object:set_texture_mod("") + + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.blinkstatus = false + + -- check existing nametag + if not self.nametag then + self.nametag = def.nametag + end + + -- set anything changed above + self.object:set_properties(self) + + --update_tag(self) + --set_animation(self, "stand") + + -- run on_spawn function if found + if self.on_spawn and not self.on_spawn_run then + if self.on_spawn(self) then + self.on_spawn_run = true -- if true, set flag to run once only + end + end + + -- run after_activate + if def.after_activate then + def.after_activate(self, staticdata, def, dtime) + end + + if use_cmi then + self._cmi_components = cmi.activate_components(self.serialized_cmi_components) + cmi.notify_activate(self.object, dtime) + end +end \ No newline at end of file From d07d0ae31c0d39c526c8418e725b5dce1d120793 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 15:34:07 -0400 Subject: [PATCH 033/176] Make mobs jump properly --- .../mcl_mobs/api/mob_functions/ai.lua | 42 +++++++++++++++++++ .../mcl_mobs/api/mob_functions/movement.lua | 12 ++++++ 2 files changed, 54 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 1a3066b971..a1f829d848 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -1,5 +1,14 @@ local math_random = math.random +local vector_multiply = vector.multiply + +local minetest_yaw_to_dir = minetest.yaw_to_dir +local minetest_get_item_group = minetest.get_item_group +local minetest_get_node = minetest.get_node + + + + -- execute current state (stand, walk, run, attacks) -- returns true if mob has died local do_states = function(self, dtime) @@ -17,6 +26,35 @@ local do_states = function(self, dtime) end + + + + +--check if a mob needs to jump +local jump_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 collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector_multiply(dir, radius) + + + local test_dir = vector.add(pos,dir) + + if minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 then + print("jump") + mobs.jump(self) + end +end + + + + + mobs.mob_step = function(self, dtime) --do not continue if non-existent @@ -34,6 +72,8 @@ mobs.mob_step = function(self, dtime) do_states(self, dtime) + jump_check(self) + mobs.movement_rotation_lock(self) @@ -201,4 +241,6 @@ mobs.mob_step = function(self, dtime) end end ]]-- + + self.old_velocity = self.object:get_velocity() end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 8fb30f76a5..72ee3824d7 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -51,4 +51,16 @@ mobs.get_velocity = function(self) end return 0 +end + +--make mobs jump +mobs.jump = function(self, velocity) + + if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then + return + end + + velocity = velocity or 5 + + self.object:add_velocity(vector_new(0,velocity,0)) end \ No newline at end of file From 246bdf9707c98f787cb5264dc7ff638e340d768b Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 15:55:10 -0400 Subject: [PATCH 034/176] Implement basic mob walking animation test --- mods/ENTITIES/mcl_mobs/api/api.lua | 3 +-- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 3 ++- .../mcl_mobs/api/mob_functions/animation.lua | 13 +++---------- mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua | 2 +- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index fad7b8c28f..9ffb4f3e42 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -299,10 +299,9 @@ function mobs:register_mob(name, def) pushable = def.pushable or true, --j4i stuff - --automatic_rotate = 360, yaw = 0, automatic_face_movement_dir = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 - automatic_face_movement_max_rotation_per_sec = 270, --degrees + automatic_face_movement_max_rotation_per_sec = 360, --degrees backface_culling = true, walk_timer = 0, stand_timer = 0, diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index a1f829d848..2b16bfb40c 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -20,6 +20,8 @@ local do_states = function(self, dtime) self.state_timer = math.random(0,2) + math.random() --let's do a random state self.yaw = (math_random() * (math.pi * 2)) + + mobs.set_animation(self, "walk") end mobs.set_velocity(self,1) @@ -46,7 +48,6 @@ local jump_check = function(self,dtime) local test_dir = vector.add(pos,dir) if minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 then - print("jump") mobs.jump(self) 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 8de235ab76..5750a63b8d 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -3,7 +3,7 @@ local math_sin = math.sin local math_cos = math.cos -- set defined animation -local set_animation = function(self, anim, fixed_frame) +mobs.set_animation = function(self, anim, fixed_frame) if not self.animation or not anim then return end @@ -13,9 +13,8 @@ local set_animation = function(self, anim, fixed_frame) self.animation.current = self.animation.current or "" - if (anim == self.animation.current - or not self.animation[anim .. "_start"] - or not self.animation[anim .. "_end"]) and self.state ~= "die" then + if (not self.animation[anim .. "_start"] or not self.animation[anim .. "_end"]) then + print("largablarga") return end @@ -37,12 +36,6 @@ local set_animation = function(self, anim, fixed_frame) end --- above function exported for mount.lua -function mobs:set_animation(self, anim) - set_animation(self, anim) -end - - mobs.death_effect = function(pos, yaw, collisionbox, rotate) 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 87e1fb8df1..a0f7b1def5 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -194,7 +194,7 @@ mobs.mob_activate = function(self, staticdata, def, dtime) self.object:set_properties(self) --update_tag(self) - --set_animation(self, "stand") + --mobs.set_animation(self, "stand") -- run on_spawn function if found if self.on_spawn and not self.on_spawn_run then From 375d683d08266586d024491dcba2268c66583989 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 16:18:42 -0400 Subject: [PATCH 035/176] Fix forgotten localization in collision.lua --- mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua index 525dcfd6a5..e6c89e2dbc 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua @@ -1,5 +1,7 @@ local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius +local math_random = math.random + local integer_test = {-1,1} mobs.collision = function(self) From c2bac87a6d03364193aedf67c780fdea9f545cac Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 15 Apr 2021 21:46:33 -0400 Subject: [PATCH 036/176] Update set_up.lua --- mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua | 1 + 1 file changed, 1 insertion(+) 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 a0f7b1def5..8a17582386 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -1,5 +1,6 @@ local math_random = math.random +local minetest_settings = minetest.settings local state_randomization = {"stand", "walk"} From 626c30de6d4191cd4a18b0f11cb4805c425f9648 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 11:30:55 -0400 Subject: [PATCH 037/176] Create todo.txt --- mods/ENTITIES/mcl_mobs/todo.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 mods/ENTITIES/mcl_mobs/todo.txt diff --git a/mods/ENTITIES/mcl_mobs/todo.txt b/mods/ENTITIES/mcl_mobs/todo.txt new file mode 100644 index 0000000000..7598b14ed8 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/todo.txt @@ -0,0 +1 @@ +--use vector.distance to count down mob despawn timer \ No newline at end of file From 94ca7e8b89bd39144d85bc6a622778babb226d47 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 11:31:18 -0400 Subject: [PATCH 038/176] Add in state switch and state execution for mobs --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + .../mcl_mobs/api/mob_functions/ai.lua | 42 ++++++++++++++----- .../mcl_mobs/api/mob_functions/set_up.lua | 10 +++-- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 9ffb4f3e42..50d744e6c2 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -305,6 +305,7 @@ function mobs:register_mob(name, def) backface_culling = true, walk_timer = 0, stand_timer = 0, + wandering = true, --end j4i stuff -- MCL2 extensions diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 2b16bfb40c..1e9143ca54 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -7,24 +7,44 @@ local minetest_get_item_group = minetest.get_item_group local minetest_get_node = minetest.get_node +local state_list_wandering = {"stand", "walk"} --- execute current state (stand, walk, run, attacks) --- returns true if mob has died -local do_states = function(self, dtime) +-- state switching logic (stand, walk, run, attacks) +local state_switch = function(self, dtime) + self.state_timer = self.state_timer - dtime + if self.wandering and self.state_timer <= 0 then + self.state_timer = math.random(4,10) + math.random() + self.state = state_list_wandering[math.random(1,#state_list_wandering)] + end +end + +-- states are executed here (goto would have been helpful :<) +local state_execution = function(self,dtime) + local yaw = self.object:get_yaw() or 0 - self.state_timer = self.state_timer - dtime + if self.state == "standing" then - if self.state_timer <= 0 then - self.state_timer = math.random(0,2) + math.random() - --let's do a random state - self.yaw = (math_random() * (math.pi * 2)) + print("stand") - mobs.set_animation(self, "walk") + elseif self.state == "walking" then + + print("walk") + + elseif self.state == "run" then + + print("run") + + elseif self.state == "attack" then + + print("attack") + end - mobs.set_velocity(self,1) + --mobs.set_animation(self, state_list_wandering[math.random(1,#state_list_wandering)]) + --mobs.set_velocity(self,1) + --self.yaw = (math_random() * (math.pi * 2)) end @@ -71,7 +91,7 @@ mobs.mob_step = function(self, dtime) --end - do_states(self, dtime) + state_switch(self, dtime) jump_check(self) 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 8a17582386..adbb710772 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -22,6 +22,7 @@ mobs.mob_staticdata = function(self) return ""-- nil end --]] + self.remove_ok = true self.attack = nil self.following = nil @@ -53,11 +54,9 @@ end mobs.mob_activate = function(self, staticdata, def, dtime) -- remove monsters in peaceful mode - if self.type == "monster" - and minetest_settings:get_bool("only_peaceful_mobs", false) then + if self.type == "monster" and minetest_settings:get_bool("only_peaceful_mobs", false) then mcl_burning.extinguish(self.object) self.object:remove() - return end @@ -70,6 +69,11 @@ mobs.mob_activate = function(self, staticdata, def, dtime) end end + --set up wandering + if not self.wandering then + self.wandering = true + end + -- select random texture, set model and size if not self.base_texture then From a934a59f3b64e8adef64676daaf81b574a6ceecd Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 11:50:13 -0400 Subject: [PATCH 039/176] Implement mob random walk directions --- .../mcl_mobs/api/mob_functions/ai.lua | 105 +++++++++++------- 1 file changed, 62 insertions(+), 43 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 1e9143ca54..707835a6a4 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -10,46 +10,6 @@ local minetest_get_node = minetest.get_node local state_list_wandering = {"stand", "walk"} --- state switching logic (stand, walk, run, attacks) -local state_switch = function(self, dtime) - self.state_timer = self.state_timer - dtime - if self.wandering and self.state_timer <= 0 then - self.state_timer = math.random(4,10) + math.random() - self.state = state_list_wandering[math.random(1,#state_list_wandering)] - end -end - --- states are executed here (goto would have been helpful :<) -local state_execution = function(self,dtime) - - local yaw = self.object:get_yaw() or 0 - - if self.state == "standing" then - - print("stand") - - elseif self.state == "walking" then - - print("walk") - - elseif self.state == "run" then - - print("run") - - elseif self.state == "attack" then - - print("attack") - - end - - --mobs.set_animation(self, state_list_wandering[math.random(1,#state_list_wandering)]) - --mobs.set_velocity(self,1) - --self.yaw = (math_random() * (math.pi * 2)) -end - - - - --check if a mob needs to jump @@ -74,6 +34,67 @@ end +-- state switching logic (stand, walk, run, attacks) +local state_switch = function(self, dtime) + self.state_timer = self.state_timer - dtime + if self.wandering and self.state_timer <= 0 then + self.state_timer = math.random(4,10) + math.random() + self.state = state_list_wandering[math.random(1,#state_list_wandering)] + end +end + +-- states are executed here (goto would have been helpful :<) +local state_execution = function(self,dtime) + + --local yaw = self.object:get_yaw() or 0 + + if self.state == "stand" then + + print("stand") + + elseif self.state == "walk" 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)) + end + + --do animation + mobs.set_animation(self, "walk") + + --enable rotation locking + mobs.movement_rotation_lock(self) + + --set the velocity of the mob + mobs.set_velocity(self,1) + + --check for nodes to jump over + jump_check(self) + + --print("walk") + + elseif self.state == "run" then + + print("run") + + elseif self.state == "attack" then + + print("attack") + + end + +end + + + + mobs.mob_step = function(self, dtime) @@ -93,11 +114,9 @@ mobs.mob_step = function(self, dtime) state_switch(self, dtime) - jump_check(self) + state_execution(self,dtime) - mobs.movement_rotation_lock(self) - -- can mob be pushed, if so calculate direction -- do this last (overrides everything) if self.pushable then mobs.collision(self) From f38492bcb031b7fcc2ee8299f66fcd3cd3a68398 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 11:50:29 -0400 Subject: [PATCH 040/176] Re-implement animation check gate for mobs --- mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index 5750a63b8d..2dc0ce34bb 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -13,8 +13,14 @@ mobs.set_animation = function(self, anim, fixed_frame) self.animation.current = self.animation.current or "" - if (not self.animation[anim .. "_start"] or not self.animation[anim .. "_end"]) then - print("largablarga") + --animations break if they are constantly set + --so we put this return gate to check if it is + --already at the animation we are trying to implement + if self.animation.current == anim then + return + end + + if (not self.animation[anim .. "_start"] or not self.animation[anim .. "_end"]) then return end From 024cf46307abb6fefbfe8be04941205026561177 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 11:52:29 -0400 Subject: [PATCH 041/176] Adjust spacing in animation.lua --- mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index 2dc0ce34bb..3056e59d6f 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -1,12 +1,12 @@ local math_pi = math.pi -local math_sin = math.sin -local math_cos = math.cos -- set defined animation mobs.set_animation = function(self, anim, fixed_frame) + if not self.animation or not anim then return end + if self.state == "die" and anim ~= "die" and anim ~= "stand" then return end From d0695e7929460728f7da2e01cc809cb343481e1a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 13:58:08 -0400 Subject: [PATCH 042/176] Fix mob animation "memory leak" --- mods/ENTITIES/mcl_mobs/api/api.lua | 26 ++++++++----------- .../mcl_mobs/api/mob_functions/ai.lua | 10 +++++-- .../mcl_mobs/api/mob_functions/animation.lua | 23 ++++++++-------- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 50d744e6c2..e8c42b5735 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -219,6 +219,7 @@ function mobs:register_mob(name, def) breathes_in_water = def.breathes_in_water or false, physical = true, collisionbox = collisionbox, + collide_with_objects = def.collide_with_objects or false, selectionbox = def.selectionbox or def.collisionbox, visual = def.visual, visual_size = def.visual_size or {x = 1, y = 1}, @@ -306,6 +307,8 @@ function mobs:register_mob(name, def) walk_timer = 0, stand_timer = 0, wandering = true, + current_animation = "", + --set_animation = mobs.set_animation, --end j4i stuff -- MCL2 extensions @@ -331,27 +334,21 @@ function mobs:register_mob(name, def) on_spawn = def.on_spawn, - on_blast = def.on_blast or do_tnt, + --on_blast = def.on_blast or do_tnt, - on_step = mobs.mob_step, + on_step = mobs.mob_step, - do_punch = def.do_punch, + --do_punch = def.do_punch, - on_punch = mob_punch, + --on_punch = mob_punch, - on_breed = def.on_breed, + --on_breed = def.on_breed, - on_grown = def.on_grown, + --on_grown = def.on_grown, - on_detach_child = mob_detach_child, + --on_detach_child = mob_detach_child, on_activate = function(self, staticdata, dtime) - --this is a temporary hack so mobs stop - --glitching and acting really weird with the - --default built in engine collision detection - self.object:set_properties({ - collide_with_objects = false, - }) self.object:set_acceleration(vector_new(0,-9.81, 0)) return mobs.mob_activate(self, staticdata, def, dtime) end, @@ -360,8 +357,7 @@ function mobs:register_mob(name, def) return mobs.mob_staticdata(self) end, - harmed_by_heal = def.harmed_by_heal, - + --harmed_by_heal = def.harmed_by_heal, }) if minetest_get_modpath("doc_identifier") ~= nil then diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 707835a6a4..11954e28a3 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -50,7 +50,13 @@ local state_execution = function(self,dtime) if self.state == "stand" then - print("stand") + --do animation + mobs.set_mob_animation(self, "stand") + + --set the velocity of the mob + mobs.set_velocity(self,0) + + --print("stand") elseif self.state == "walk" then @@ -67,7 +73,7 @@ local state_execution = function(self,dtime) end --do animation - mobs.set_animation(self, "walk") + mobs.set_mob_animation(self, "walk") --enable rotation locking mobs.movement_rotation_lock(self) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index 3056e59d6f..2f89333dab 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -1,8 +1,8 @@ local math_pi = math.pi -- set defined animation -mobs.set_animation = function(self, anim, fixed_frame) - +mobs.set_mob_animation = function(self, anim, fixed_frame) + if not self.animation or not anim then return end @@ -11,23 +11,21 @@ mobs.set_animation = function(self, anim, fixed_frame) return end - self.animation.current = self.animation.current or "" - - --animations break if they are constantly set - --so we put this return gate to check if it is - --already at the animation we are trying to implement - if self.animation.current == anim then - return - end if (not self.animation[anim .. "_start"] or not self.animation[anim .. "_end"]) then return end - self.animation.current = anim + --animations break if they are constantly set + --so we put this return gate to check if it is + --already at the animation we are trying to implement + if self.current_animation == anim then + return + end local a_start = self.animation[anim .. "_start"] local a_end + if fixed_frame then a_end = a_start else @@ -39,6 +37,9 @@ mobs.set_animation = function(self, anim, fixed_frame) y = a_end}, self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, 0, self.animation[anim .. "_loop"] ~= false) + + + self.current_animation = anim end From adc683c6a7cd56c33bebc22ce1363671db4f4846 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 14:19:22 -0400 Subject: [PATCH 043/176] Clear mob animation on activate --- mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua | 3 +++ 1 file changed, 3 insertions(+) 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 adbb710772..1d48d52f70 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -74,6 +74,9 @@ mobs.mob_activate = function(self, staticdata, def, dtime) self.wandering = true end + --clear animation + self.current_animation = nil + -- select random texture, set model and size if not self.base_texture then From 2486ffef11113a40b43a2548bde57e9cca186da9 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 15:30:44 -0400 Subject: [PATCH 044/176] Make wandering mobs avoid cliffs --- .../mcl_mobs/api/mob_functions/ai.lua | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 11954e28a3..08d6916f57 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -1,16 +1,42 @@ local math_random = math.random local vector_multiply = vector.multiply +local vector_add = vector.add local minetest_yaw_to_dir = minetest.yaw_to_dir local minetest_get_item_group = minetest.get_item_group local minetest_get_node = minetest.get_node +local minetest_line_of_sight = minetest.line_of_sight local state_list_wandering = {"stand", "walk"} +local DOUBLE_PI = math.pi * 2 +local EIGHTH_PI = DOUBLE_PI * 0.125 +--this is basically reverse jump_check +local cliff_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 collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + local free_fall, blocker = 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 + +--a simple helper function which is too small to move into movement.lua +local quick_rotate_45 = function(self,dtime) + self.yaw = self.yaw + EIGHTH_PI + if self.yaw > DOUBLE_PI then + self.yaw = self.yaw - DOUBLE_PI + end +end --check if a mob needs to jump local jump_check = function(self,dtime) @@ -84,6 +110,17 @@ local state_execution = function(self,dtime) --check for nodes to jump over jump_check(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) + if cliff_check(self,dtime) then + --turn 45 degrees if so + quick_rotate_45(self,dtime) + end + --print("walk") elseif self.state == "run" then From 6c5393427f72c082a5c85514cb3b54aa4a9ce45f Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 15:39:39 -0400 Subject: [PATCH 045/176] Smooth out mob cliff check and check if falling before cliff check --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 08d6916f57..06c6d00acb 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -12,17 +12,26 @@ local minetest_line_of_sight = minetest.line_of_sight local state_list_wandering = {"stand", "walk"} local DOUBLE_PI = math.pi * 2 -local EIGHTH_PI = DOUBLE_PI * 0.125 +local THIRTY_SECONDTH_PI = DOUBLE_PI * 0.03125 --this is basically reverse jump_check local cliff_check = function(self,dtime) + --mobs will flip out if they are falling without this + if self.object:get_velocity().y ~= 0 then + return false + end + 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 radius = collisionbox[4] + 0.5 + dir = vector_multiply(dir,radius) + local free_fall, blocker = 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}) @@ -32,7 +41,7 @@ end --a simple helper function which is too small to move into movement.lua local quick_rotate_45 = function(self,dtime) - self.yaw = self.yaw + EIGHTH_PI + self.yaw = self.yaw + THIRTY_SECONDTH_PI if self.yaw > DOUBLE_PI then self.yaw = self.yaw - DOUBLE_PI end From a6a54b34140c279d7a9ff3db5b21f1be0ead15f8 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 15:49:03 -0400 Subject: [PATCH 046/176] Make mobs not jump if against a wall --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 06c6d00acb..7b154f0d86 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -60,9 +60,17 @@ local jump_check = function(self,dtime) vector_multiply(dir, radius) + --only jump if there's a node and a non-solid node above it local test_dir = vector.add(pos,dir) - if minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 then + local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 + + test_dir.y = test_dir.y + 1 + + local green_flag_2 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") == 0 + + + if green_flag_1 and green_flag_2 then mobs.jump(self) end end From fb9a55e562c3e4102fa4e02603f93d1c78e397ad Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 15:55:11 -0400 Subject: [PATCH 047/176] Make jump_check more modular and allow mobs to turn if at a wall --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 7b154f0d86..adffc69514 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -70,9 +70,14 @@ local jump_check = function(self,dtime) local green_flag_2 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") == 0 - if green_flag_1 and green_flag_2 then - mobs.jump(self) + 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 --wall in front of + return(2) end + + --nothing to jump over + return(0) end @@ -125,7 +130,11 @@ local state_execution = function(self,dtime) mobs.set_velocity(self,1) --check for nodes to jump over - jump_check(self) + local node_in_front_of = jump_check(self) + + if node_in_front_of == 1 then + mobs.jump(self) + end --turn if on the edge of cliff --(this is written like this because unlike @@ -133,7 +142,7 @@ local state_execution = function(self,dtime) --this requires a mob to turn, removing the --ease of a full implementation for it in a single --function) - if cliff_check(self,dtime) then + if node_in_front_of == 2 or cliff_check(self,dtime) then --turn 45 degrees if so quick_rotate_45(self,dtime) end From 57b293de2b02be81ff3e17e620807c653fe9b625 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 16:37:15 -0400 Subject: [PATCH 048/176] Make mobs gravity equal to player's --- mods/ENTITIES/mcl_mobs/api/api.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index e8c42b5735..9de87408a6 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -58,6 +58,8 @@ local DEATH_DELAY = 0.5 local DEFAULT_FALL_SPEED = -10 local FLOP_HEIGHT = 5.0 local FLOP_HOR_SPEED = 1.5 +local GRAVITY = minetest_settings:get("movement_gravity") + 9.81 + local MOB_CAP = {} MOB_CAP.hostile = 70 @@ -308,6 +310,7 @@ function mobs:register_mob(name, def) stand_timer = 0, wandering = true, current_animation = "", + gravity = GRAVITY, --set_animation = mobs.set_animation, --end j4i stuff @@ -322,7 +325,7 @@ function mobs:register_mob(name, def) child = def.child or false, texture_mods = {}, shoot_arrow = def.shoot_arrow, - sounds_child = def.sounds_child, + sounds_child = def.sounds_child, explosion_strength = def.explosion_strength, suffocation_timer = 0, follow_velocity = def.follow_velocity or 2.4, @@ -349,7 +352,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,-9.81, 0)) + self.object:set_acceleration(vector_new(0,-GRAVITY, 0)) return mobs.mob_activate(self, staticdata, def, dtime) end, From cadd53c103f4047069f581abdc033d2def4ed2dd Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 16:39:03 -0400 Subject: [PATCH 049/176] Adjust mob jumping default to account for higher gravity --- mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 72ee3824d7..390a867789 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -60,7 +60,7 @@ mobs.jump = function(self, velocity) return end - velocity = velocity or 5 + velocity = velocity or 8 self.object:add_velocity(vector_new(0,velocity,0)) end \ No newline at end of file From 8ca5f221ec9ce534e91f7094193b4ec951e743b1 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 18:13:54 -0400 Subject: [PATCH 050/176] clean up ai.lua --- .../mcl_mobs/api/mob_functions/ai.lua | 166 ----------------- .../api/mob_functions/backup_code_api.lua | 169 ++++++++++++++++++ 2 files changed, 169 insertions(+), 166 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index adffc69514..4907063956 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -175,12 +175,6 @@ mobs.mob_step = function(self, dtime) --print(self.object:get_yaw()) - --if self.state == "die" then - -- print("need custom die stop moving thing") - -- return - --end - - state_switch(self, dtime) state_execution(self,dtime) @@ -191,165 +185,5 @@ mobs.mob_step = function(self, dtime) mobs.collision(self) end - - --if not self.fire_resistant then - -- mcl_burning.tick(self.object, dtime) - --end - - --if use_cmi then - --cmi.notify_step(self.object, dtime) - --end - - --local pos = self.object:get_pos() - --local yaw = 0 - - --if mobs_debug then - --update_tag(self) - --end - - - - --if self.jump_sound_cooloff > 0 then - -- self.jump_sound_cooloff = self.jump_sound_cooloff - dtime - --end - - --if self.opinion_sound_cooloff > 0 then - -- self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime - --end - - --if falling(self, pos) then - -- Return if mob died after falling - -- return - --end - - - -- run custom function (defined in mob lua file) - --if self.do_custom then - - -- when false skip going any further - --if self.do_custom(self, dtime) == false then - -- return - --end - --end - - -- knockback timer - --if self.pause_timer > 0 then - - -- self.pause_timer = self.pause_timer - dtime - - -- return - --end - - -- attack timer - --self.timer = self.timer + dtime - - --[[ - if self.state ~= "attack" then - - if self.timer < 1 then - print("returning>>error code 1") - return - end - - self.timer = 0 - end - ]]-- - - -- never go over 100 - --if self.timer > 100 then - -- self.timer = 1 - --end - - -- mob plays random sound at times - --if math_random(1, 70) == 1 then - -- mob_sound(self, "random", true) - --end - - -- environmental damage timer (every 1 second) - --self.env_damage_timer = self.env_damage_timer + dtime - - --if (self.state == "attack" and self.env_damage_timer > 1) - --or self.state ~= "attack" then - -- - -- self.env_damage_timer = 0 - -- - -- -- check for environmental damage (water, fire, lava etc.) - -- if do_env_damage(self) then - -- return - -- end - -- - -- node replace check (cow eats grass etc.) - -- replace(self, pos) - --end - - --monster_attack(self) - - --npc_attack(self) - - --breed(self) - - --do_jump(self) - - --runaway_from(self) - - - --if is_at_water_danger(self) and self.state ~= "attack" 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 = set_yaw(self, yaw, 8) - -- end - --end - - - -- Add water flowing for mobs from mcl_item_entity - --[[ - local p, node, nn, def - p = self.object:get_pos() - node = minetest_get_node_or_nil(p) - if node then - nn = node.name - def = minetest_registered_nodes[nnenable_physicss if not on/in flowing liquid - self._flowing = false - enable_physics(self.object, self, true) - return - end - - --Mob following code. - follow_flop(self) - - - if is_at_cliff_or_danger(self) then - set_velocity(self, 0) - self.state = "stand" - set_animation(self, "stand") - local yaw = self.object:get_yaw() or 0 - yaw = set_yaw(self, yaw + 0.78, 8) - end - - -- Despawning: when lifetimer expires, remove mob - if remove_far - and self.can_despawn == true - and ((not self.nametag) or (self.nametag == "")) - and self.state ~= "attack" - and self.following == nil then - - self.lifetimer = self.lifetimer - dtime - if self.despawn_immediately or self.lifetimer <= 0 then - minetest.log("action", "Mob "..self.name.." despawns in mob_step at "..minetest.pos_to_string(pos, 1)) - mcl_burning.extinguish(self.object) - self.object:remove() - elseif self.lifetimer <= 10 then - if math_random(10) < 4 then - self.despawn_immediately = true - else - self.lifetimer = 20 - end - end - end - ]]-- - self.old_velocity = self.object:get_velocity() end 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.lua index eb1389e371..292a27ec0d 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua @@ -3297,3 +3297,172 @@ end function mobs:yaw(self, yaw, delay, dtime) set_yaw(self, yaw, delay, dtime) end + + +mob_step = function() + + --if self.state == "die" then + -- print("need custom die stop moving thing") + -- return + --end + + --if not self.fire_resistant then + -- mcl_burning.tick(self.object, dtime) + --end + + --if use_cmi then + --cmi.notify_step(self.object, dtime) + --end + + --local pos = self.object:get_pos() + --local yaw = 0 + + --if mobs_debug then + --update_tag(self) + --end + + + + --if self.jump_sound_cooloff > 0 then + -- self.jump_sound_cooloff = self.jump_sound_cooloff - dtime + --end + + --if self.opinion_sound_cooloff > 0 then + -- self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime + --end + + --if falling(self, pos) then + -- Return if mob died after falling + -- return + --end + + + -- run custom function (defined in mob lua file) + --if self.do_custom then + + -- when false skip going any further + --if self.do_custom(self, dtime) == false then + -- return + --end + --end + + -- knockback timer + --if self.pause_timer > 0 then + + -- self.pause_timer = self.pause_timer - dtime + + -- return + --end + + -- attack timer + --self.timer = self.timer + dtime + + --[[ + if self.state ~= "attack" then + + if self.timer < 1 then + print("returning>>error code 1") + return + end + + self.timer = 0 + end + ]]-- + + -- never go over 100 + --if self.timer > 100 then + -- self.timer = 1 + --end + + -- mob plays random sound at times + --if math_random(1, 70) == 1 then + -- mob_sound(self, "random", true) + --end + + -- environmental damage timer (every 1 second) + --self.env_damage_timer = self.env_damage_timer + dtime + + --if (self.state == "attack" and self.env_damage_timer > 1) + --or self.state ~= "attack" then + -- + -- self.env_damage_timer = 0 + -- + -- -- check for environmental damage (water, fire, lava etc.) + -- if do_env_damage(self) then + -- return + -- end + -- + -- node replace check (cow eats grass etc.) + -- replace(self, pos) + --end + + --monster_attack(self) + + --npc_attack(self) + + --breed(self) + + --do_jump(self) + + --runaway_from(self) + + + --if is_at_water_danger(self) and self.state ~= "attack" 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 = set_yaw(self, yaw, 8) + -- end + --end + + + -- Add water flowing for mobs from mcl_item_entity + --[[ + local p, node, nn, def + p = self.object:get_pos() + node = minetest_get_node_or_nil(p) + if node then + nn = node.name + def = minetest_registered_nodes[nnenable_physicss if not on/in flowing liquid + self._flowing = false + enable_physics(self.object, self, true) + return + end + + --Mob following code. + follow_flop(self) + + + if is_at_cliff_or_danger(self) then + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + local yaw = self.object:get_yaw() or 0 + yaw = set_yaw(self, yaw + 0.78, 8) + end + + -- Despawning: when lifetimer expires, remove mob + if remove_far + and self.can_despawn == true + and ((not self.nametag) or (self.nametag == "")) + and self.state ~= "attack" + and self.following == nil then + + self.lifetimer = self.lifetimer - dtime + if self.despawn_immediately or self.lifetimer <= 0 then + minetest.log("action", "Mob "..self.name.." despawns in mob_step at "..minetest.pos_to_string(pos, 1)) + mcl_burning.extinguish(self.object) + self.object:remove() + elseif self.lifetimer <= 10 then + if math_random(10) < 4 then + self.despawn_immediately = true + else + self.lifetimer = 20 + end + end + end + ]]-- + +end \ No newline at end of file From ed456ecb47d788efe9aa526849110015e9c04e9a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 18:17:51 -0400 Subject: [PATCH 051/176] Make mobs not fear cliffs if fear_height is 0 --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 4907063956..080d02b226 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -142,7 +142,7 @@ local state_execution = function(self,dtime) --this requires a mob to turn, removing the --ease of a full implementation for it in a single --function) - if node_in_front_of == 2 or cliff_check(self,dtime) then + if node_in_front_of == 2 or (self.fear_height ~= 0 and cliff_check(self,dtime)) then --turn 45 degrees if so quick_rotate_45(self,dtime) end From c761db86c7e67aab27d3806a76b7a58504a7d5c6 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 18:29:42 -0400 Subject: [PATCH 052/176] re-arrange mob logic for random wandering --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 080d02b226..6eb0b99d94 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -126,25 +126,29 @@ local state_execution = function(self,dtime) --enable rotation locking mobs.movement_rotation_lock(self) - --set the velocity of the mob - mobs.set_velocity(self,1) + --check for nodes to jump over local node_in_front_of = jump_check(self) if node_in_front_of == 1 then mobs.jump(self) - end - --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) - if node_in_front_of == 2 or (self.fear_height ~= 0 and cliff_check(self,dtime)) then + elseif node_in_front_of == 2 or (self.fear_height ~= 0 and cliff_check(self,dtime)) then --turn 45 degrees if so quick_rotate_45(self,dtime) + mobs.set_velocity(self,0) + end + + --only move forward if path is clear + if node_in_front_of == 0 or node_in_front_of == 1 then + --set the velocity of the mob + mobs.set_velocity(self,1) end --print("walk") From 05d06a4c8f0128ac5edd21b8096bb75553c1f89e Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 18:36:23 -0400 Subject: [PATCH 053/176] Add comment to state_execution --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 6eb0b99d94..e89aba317a 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -126,8 +126,6 @@ local state_execution = function(self,dtime) --enable rotation locking mobs.movement_rotation_lock(self) - - --check for nodes to jump over local node_in_front_of = jump_check(self) @@ -142,6 +140,7 @@ local state_execution = function(self,dtime) elseif node_in_front_of == 2 or (self.fear_height ~= 0 and cliff_check(self,dtime)) then --turn 45 degrees if so quick_rotate_45(self,dtime) + --stop the mob so it doesn't fall off mobs.set_velocity(self,0) end From ce7f4918b061fa9a4d46045a389497cb0da1a5ee Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 19:35:19 -0400 Subject: [PATCH 054/176] Re-organize comments --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index e89aba317a..ed7998c08b 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -69,10 +69,11 @@ local jump_check = function(self,dtime) local green_flag_2 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") == 0 - - if green_flag_1 and green_flag_2 then -- can jump over node + 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 --wall in front of + elseif green_flag_1 and not green_flag_2 then + --wall in front of mob return(2) end @@ -131,6 +132,7 @@ local state_execution = function(self,dtime) 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 From 9d6d042ee325a010d97abdff7efc37f3dcf46b5e Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 19:37:01 -0400 Subject: [PATCH 055/176] Fix formatting in ai.lua --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 3 --- 1 file changed, 3 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index ed7998c08b..93e11e35be 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -23,11 +23,8 @@ local cliff_check = function(self,dtime) end local pos = self.object:get_pos() - 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) From 15ea9c1c71f3e4d4dd24ce145d385f8457e4905e Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 19:59:20 -0400 Subject: [PATCH 056/176] Implement self walking velocity for walking state --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 93e11e35be..982641e738 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -146,7 +146,7 @@ local state_execution = function(self,dtime) --only move forward if path is clear if node_in_front_of == 0 or node_in_front_of == 1 then --set the velocity of the mob - mobs.set_velocity(self,1) + mobs.set_velocity(self,self.walk_velocity) end --print("walk") From 6db4511dd5b038cd95c7ea196559bb25a53246e9 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 20:06:55 -0400 Subject: [PATCH 057/176] Add notes --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 2 +- mods/ENTITIES/mcl_mobs/api/mob_functions/combat_interaction.lua | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/combat_interaction.lua diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 982641e738..73f5beff3c 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -167,7 +167,7 @@ end - +--the main loop mobs.mob_step = function(self, dtime) --do not continue if non-existent diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/combat_interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/combat_interaction.lua new file mode 100644 index 0000000000..5ba67b28c5 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/combat_interaction.lua @@ -0,0 +1 @@ +--make mobs scan players and check distance then if direct line of sight then add to list and go after whichever one is closer \ No newline at end of file From 52c3db041e602ebd0861a0b86c55b35662c8c33a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 20:32:05 -0400 Subject: [PATCH 058/176] Add in fly state prep for mobs --- mods/ENTITIES/mcl_mobs/api/api.lua | 2 +- .../mcl_mobs/api/mob_functions/ai.lua | 88 ++++++++++++++++--- 2 files changed, 75 insertions(+), 15 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 9de87408a6..330fdcd849 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -218,7 +218,7 @@ function mobs:register_mob(name, def) xp_max = def.xp_max or 0, xp_timestamp = 0, breath_max = def.breath_max or 15, - breathes_in_water = def.breathes_in_water or false, + breathes_in_water = def.breathes_in_water or false, physical = true, collisionbox = collisionbox, collide_with_objects = def.collide_with_objects or false, diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 73f5beff3c..b1c6d293d9 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -8,13 +8,19 @@ local minetest_get_item_group = minetest.get_item_group local minetest_get_node = minetest.get_node local minetest_line_of_sight = minetest.line_of_sight - -local state_list_wandering = {"stand", "walk"} - local DOUBLE_PI = math.pi * 2 local THIRTY_SECONDTH_PI = DOUBLE_PI * 0.03125 +--[[ + _ _ +| | | | +| | __ _ _ __ __| | +| | / _` | '_ \ / _` | +| |___| (_| | | | | (_| | +\_____/\__,_|_| |_|\__,_| +]] + --this is basically reverse jump_check local cliff_check = function(self,dtime) --mobs will flip out if they are falling without this @@ -56,7 +62,6 @@ local jump_check = function(self,dtime) vector_multiply(dir, radius) - --only jump if there's a node and a non-solid node above it local test_dir = vector.add(pos,dir) @@ -81,19 +86,23 @@ end -- state switching logic (stand, walk, run, attacks) -local state_switch = function(self, dtime) +local land_state_list_wandering = {"stand", "walk"} + +local land_state_switch = function(self, dtime) self.state_timer = self.state_timer - dtime if self.wandering and self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() - self.state = state_list_wandering[math.random(1,#state_list_wandering)] + self.state = land_state_list_wandering[math.random(1,#land_state_list_wandering)] end + end --- states are executed here (goto would have been helpful :<) -local state_execution = function(self,dtime) +-- states are executed here +local land_state_execution = function(self,dtime) --local yaw = self.object:get_yaw() or 0 + if self.state == "stand" then --do animation @@ -102,8 +111,6 @@ local state_execution = function(self,dtime) --set the velocity of the mob mobs.set_velocity(self,0) - --print("stand") - elseif self.state == "walk" then self.walk_timer = self.walk_timer - dtime @@ -149,8 +156,6 @@ local state_execution = function(self,dtime) mobs.set_velocity(self,self.walk_velocity) end - --print("walk") - elseif self.state == "run" then print("run") @@ -166,6 +171,53 @@ end +--[[ +______ _ _ _______ _ _ +| ___| | (_) / / ___| (_) (_) +| |_ | |_ _ _ _ __ __ _ / /\ `--.__ ___ _ __ ___ _ __ ___ _ _ __ __ _ +| _| | | | | | | '_ \ / _` | / / `--. \ \ /\ / / | '_ ` _ \| '_ ` _ \| | '_ \ / _` | +| | | | |_| | | | | | (_| |/ / /\__/ /\ V V /| | | | | | | | | | | | | | | | (_| | +\_| |_|\__, |_|_| |_|\__, /_/ \____/ \_/\_/ |_|_| |_| |_|_| |_| |_|_|_| |_|\__, | + __/ | __/ | __/ | + |___/ |___/ |___/ +]]-- + + + +-- state switching logic (stand, walk, run, attacks) +local fly_state_list_wandering = {"stand", "walk"} + +local fly_state_switch = function(self, dtime) + self.state_timer = self.state_timer - dtime + if self.wandering and self.state_timer <= 0 then + self.state_timer = math.random(4,10) + math.random() + self.state = land_state_list_wandering[math.random(1,#land_state_list_wandering)] + end + +end + + + +local fly_state_execution = function(self,dtime) + + +end + +local fly_state_switch = function(self, dtime) + + +end + +--[[ +___ ___ _ _ _ +| \/ | (_) | | (_) +| . . | __ _ _ _ __ | | ___ __ _ _ ___ +| |\/| |/ _` | | '_ \ | | / _ \ / _` | |/ __| +| | | | (_| | | | | | | |___| (_) | (_| | | (__ +\_| |_/\__,_|_|_| |_| \_____/\___/ \__, |_|\___| + __/ | + |___/ +]] --the main loop mobs.mob_step = function(self, dtime) @@ -177,9 +229,17 @@ mobs.mob_step = function(self, dtime) --print(self.object:get_yaw()) - state_switch(self, dtime) - state_execution(self,dtime) + + --swimming/flying + if self.fly then + fly_state_switch(self, dtime) + fly_state_execution(self, dtime) + --regular mobs that walk around + else + land_state_switch(self, dtime) + land_state_execution(self,dtime) + end -- can mob be pushed, if so calculate direction -- do this last (overrides everything) From 84ca7681fc9ee3e9945488865678b2b82eb0a22d Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 20:47:16 -0400 Subject: [PATCH 059/176] Make squids fly in water flowing and water source --- .../mcl_mobs/api/mob_functions/ai.lua | 37 ++++++++++++++++--- mods/ENTITIES/mobs_mc/0_gameconfig.lua | 2 + mods/ENTITIES/mobs_mc/squid.lua | 2 +- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index b1c6d293d9..4313c29ce0 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -185,13 +185,13 @@ ______ _ _ _______ _ _ -- state switching logic (stand, walk, run, attacks) -local fly_state_list_wandering = {"stand", "walk"} +local fly_state_list_wandering = {"stand", "fly"} local fly_state_switch = function(self, dtime) self.state_timer = self.state_timer - dtime if self.wandering and self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() - self.state = land_state_list_wandering[math.random(1,#land_state_list_wandering)] + self.state = fly_state_list_wandering[math.random(1,#fly_state_list_wandering)] end end @@ -200,13 +200,38 @@ end local fly_state_execution = function(self,dtime) + local pos = self.object:get_pos() + local current_node = minetest_get_node(pos).name + local inside_swim_node = false + + for _,id in pairs(self.fly_in) do + if id == current_node then + inside_swim_node = true + break + end + end + + print(inside_swim_node) + + if self.state == "stand" then + + --do animation + --mobs.set_mob_animation(self, "stand") + + --set the velocity of the mob + --mobs.set_velocity(self,0) + + --print("standing") + + elseif self.state == "fly" then + + + --print("flying") + + end end -local fly_state_switch = function(self, dtime) - - -end --[[ ___ ___ _ _ _ diff --git a/mods/ENTITIES/mobs_mc/0_gameconfig.lua b/mods/ENTITIES/mobs_mc/0_gameconfig.lua index c92ccbba52..3476bee4c7 100644 --- a/mods/ENTITIES/mobs_mc/0_gameconfig.lua +++ b/mods/ENTITIES/mobs_mc/0_gameconfig.lua @@ -81,7 +81,9 @@ mobs_mc.items = { gunpowder = "tnt:gunpowder", flint_and_steel = "fire:flint_and_steel", water_source = "default:water_source", + water_flowing = "default:water_flowing", river_water_source = "default:river_water_source", + water_flowing = "default:river_water_flowing", black_dye = "dye:black", poppy = "flowers:rose", dandelion = "flowers:dandelion_yellow", diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index cf794ea5bf..fbec650ddb 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -48,7 +48,7 @@ mobs:register_mob("mobs_mc:squid", { visual_size = {x=3, y=3}, makes_footstep_sound = false, fly = true, - fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, + fly_in = { mobs_mc.items.water_source, "mcl_core:water_flowing", mobs_mc.items.river_water_source }, breathes_in_water = true, jump = false, view_range = 16, From f1141aed9fa52bf57e8867fdb3ffb520793dab07 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 21:08:54 -0400 Subject: [PATCH 060/176] Make mobs flop when outside of flying node --- .../mcl_mobs/api/mob_functions/ai.lua | 37 ++++++++++++------ .../mcl_mobs/api/mob_functions/movement.lua | 39 ++++++++++++++++++- 2 files changed, 62 insertions(+), 14 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 4313c29ce0..c77e0b1a59 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -193,41 +193,54 @@ local fly_state_switch = function(self, dtime) self.state_timer = math.random(4,10) + math.random() self.state = fly_state_list_wandering[math.random(1,#fly_state_list_wandering)] end - end +--this is going to need some more logic gates because birds can flop around +local flop = function(self,dtime) + mobs.flop(self) +end + +-- states are executed here local fly_state_execution = function(self,dtime) local pos = self.object:get_pos() local current_node = minetest_get_node(pos).name - local inside_swim_node = false + local inside_fly_node = false + --quick scan everything to see if inside fly node for _,id in pairs(self.fly_in) do if id == current_node then - inside_swim_node = true + inside_fly_node = true break end end - print(inside_swim_node) + - if self.state == "stand" then + --fly properly if inside fly node + if inside_fly_node then + if self.state == "stand" then - --do animation - --mobs.set_mob_animation(self, "stand") + --do animation + --mobs.set_mob_animation(self, "stand") - --set the velocity of the mob - --mobs.set_velocity(self,0) + --set the velocity of the mob + --mobs.set_velocity(self,0) - --print("standing") + --print("standing") - elseif self.state == "fly" then + elseif self.state == "fly" then - --print("flying") + --print("flying") + end + --flop around if not inside fly node + else + --print("flopping") + flop(self,dtime) end end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 390a867789..09e21f4707 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -1,10 +1,15 @@ local math_pi = math.pi local math_sin = math.sin local math_cos = math.cos +local math_random = math.random +local DOUBLE_PI = math_pi * 2 -- localize vector functions -local vector_new = vector.new -local vector_length = vector.length +local vector_new = vector.new +local vector_length = vector.length +local vector_multiply = vector.multiply + +local minetest_yaw_to_dir = minetest.yaw_to_dir -- move mob in facing direction --this has been modified to be internal @@ -60,7 +65,37 @@ mobs.jump = function(self, velocity) return end + --fallback velocity to allow modularity velocity = velocity or 8 self.object:add_velocity(vector_new(0,velocity,0)) +end + +--make mobs flop +mobs.flop = function(self, velocity) + + if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then + return false + end + + mobs.set_velocity(self, 0) + + --fallback velocity to allow modularity + velocity = velocity or 8 + + --create a random direction (2d yaw) + local dir = DOUBLE_PI * math_random() + + --create a random force value + 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) + + --place in the "flop" velocity to make the mob flop + final_additional_force.y = velocity + + self.object:add_velocity(final_additional_force) + + return true end \ No newline at end of file From dda7839d8c4c2292e9c8d6472faf38372654d886 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Fri, 16 Apr 2021 21:43:02 -0400 Subject: [PATCH 061/176] Add in prototype swimming --- .../mcl_mobs/api/mob_functions/ai.lua | 44 ++++++++++++++++++- .../mcl_mobs/api/mob_functions/movement.lua | 32 ++++++++++++++ mods/ENTITIES/mobs_mc/squid.lua | 1 + 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index c77e0b1a59..4a19d00670 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -2,6 +2,7 @@ local math_random = math.random local vector_multiply = vector.multiply local vector_add = vector.add +local vector_new = vector.new local minetest_yaw_to_dir = minetest.yaw_to_dir local minetest_get_item_group = minetest.get_item_group @@ -201,11 +202,32 @@ local flop = function(self,dtime) mobs.flop(self) end +--this is to swap the built in engine acceleration modifier +local fly_physics_swapper = function(self,inside_fly_node) + --push non-existing physics switch to new mobs + self.fly_physics_switch = self.fly_physics_switch or not inside_fly_node + + --should be flying, gravity is applied, switch to floating + if inside_fly_node and not self.fly_physics_switch then + self.object:set_acceleration(vector_new(0,0,0)) + self.fly_physics_switch = true + --not be flying, gravity isn't applied, switch to falling + elseif not inside_fly_node and self.fly_physics_switch then + self.pitch = 0 + self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.fly_physics_switch = false + end +end + + +local random_pitch_multiplier = {-1,1} -- states are executed here local fly_state_execution = function(self,dtime) local pos = self.object:get_pos() + + pos.y = pos.y + self.object:get_properties().collisionbox[5] local current_node = minetest_get_node(pos).name local inside_fly_node = false @@ -217,10 +239,12 @@ local fly_state_execution = function(self,dtime) end end - + --turn gravity on or off + fly_physics_swapper(self,inside_fly_node) --fly properly if inside fly node if inside_fly_node then + if self.state == "stand" then --do animation @@ -231,11 +255,27 @@ local fly_state_execution = function(self,dtime) --print("standing") + mobs.set_fly_velocity(self,0) + elseif self.state == "fly" then + self.walk_timer = self.walk_timer - dtime - --print("flying") + --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)) + --create a truly random pitch, since there is no easy access to pitch math that I can find + self.pitch = math_random() * random_pitch_multiplier[math_random(1,2)] + end + + + mobs.set_fly_velocity(self,self.walk_velocity) end --flop around if not inside fly node else diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 09e21f4707..681d97a1e0 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -98,4 +98,36 @@ mobs.flop = function(self, velocity) self.object:add_velocity(final_additional_force) return true +end + + + +-- move mob in facing direction +--this has been modified to be internal +--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) + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = (math_sin(yaw) * -v), + y = pitch, + 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))) + end + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end end \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index fbec650ddb..f650472fc7 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -16,6 +16,7 @@ mobs:register_mob("mobs_mc:squid", { xp_min = 1, xp_max = 3, armor = 100, + rotate = 270, -- FIXME: If the squid is near the floor, it turns black collisionbox = {-0.4, 0.0, -0.4, 0.4, 0.9, 0.4}, visual = "mesh", From 5365dec19a8a088263916a3686f27859be51e870 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 12:01:27 -0400 Subject: [PATCH 062/176] Adjust "flying" vector checks for mobs --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 9 ++------- mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua | 4 ++++ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 4a19d00670..fe091b5d2e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -205,18 +205,13 @@ end --this is to swap the built in engine acceleration modifier local fly_physics_swapper = function(self,inside_fly_node) - --push non-existing physics switch to new mobs - self.fly_physics_switch = self.fly_physics_switch or not inside_fly_node - --should be flying, gravity is applied, switch to floating - if inside_fly_node and not self.fly_physics_switch then + if inside_fly_node and self.object:get_acceleration().y ~= 0 then self.object:set_acceleration(vector_new(0,0,0)) - self.fly_physics_switch = true --not be flying, gravity isn't applied, switch to falling - elseif not inside_fly_node and self.fly_physics_switch then + 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.fly_physics_switch = false end end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 681d97a1e0..72f93ea242 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -111,6 +111,10 @@ mobs.set_fly_velocity = function(self, v) local yaw = (self.yaw or 0) local pitch = (self.pitch or 0) + if v == 0 then + pitch = 0 + end + local current_velocity = self.object:get_velocity() local goal_velocity = { From 061602d9d46d4e4607e407c064070709ef99f9b7 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 12:28:07 -0400 Subject: [PATCH 063/176] Overhaul separation of swimming and flying for ease of use with writing mobs api --- mods/ENTITIES/mcl_mobs/api/api.lua | 2 + .../mcl_mobs/api/mob_functions/ai.lua | 62 +++++++++---------- .../mcl_mobs/api/mob_functions/movement.lua | 29 ++++++++- mods/ENTITIES/mobs_mc/squid.lua | 3 +- 4 files changed, 61 insertions(+), 35 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 330fdcd849..47804b0d00 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -311,6 +311,8 @@ function mobs:register_mob(name, def) wandering = true, current_animation = "", gravity = GRAVITY, + swim = def.swim, + swim_in = def.swim_in or {mobs_mc.items.water_source, "mcl_core:water_flowing", mobs_mc.items.river_water_source}, --set_animation = mobs.set_animation, --end j4i stuff diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index fe091b5d2e..794f8d2f16 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -173,26 +173,24 @@ end --[[ -______ _ _ _______ _ _ -| ___| | (_) / / ___| (_) (_) -| |_ | |_ _ _ _ __ __ _ / /\ `--.__ ___ _ __ ___ _ __ ___ _ _ __ __ _ -| _| | | | | | | '_ \ / _` | / / `--. \ \ /\ / / | '_ ` _ \| '_ ` _ \| | '_ \ / _` | -| | | | |_| | | | | | (_| |/ / /\__/ /\ V V /| | | | | | | | | | | | | | | | (_| | -\_| |_|\__, |_|_| |_|\__, /_/ \____/ \_/\_/ |_|_| |_| |_|_| |_| |_|_|_| |_|\__, | - __/ | __/ | __/ | - |___/ |___/ |___/ + _____ _ +/ ___| (_) +\ `--.__ ___ _ __ ___ + `--. \ \ /\ / / | '_ ` _ \ +/\__/ /\ V V /| | | | | | | +\____/ \_/\_/ |_|_| |_| |_| ]]-- -- state switching logic (stand, walk, run, attacks) -local fly_state_list_wandering = {"stand", "fly"} +local swim_state_list_wandering = {"stand", "swim"} -local fly_state_switch = function(self, dtime) +local swim_state_switch = function(self, dtime) self.state_timer = self.state_timer - dtime if self.wandering and self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() - self.state = fly_state_list_wandering[math.random(1,#fly_state_list_wandering)] + self.state = swim_state_list_wandering[math.random(1,#swim_state_list_wandering)] end end @@ -203,13 +201,13 @@ local flop = function(self,dtime) end --this is to swap the built in engine acceleration modifier -local fly_physics_swapper = function(self,inside_fly_node) +local swim_physics_swapper = function(self,inside_swim_node) - --should be flying, gravity is applied, switch to floating - if inside_fly_node and self.object:get_acceleration().y ~= 0 then + --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)) - --not be flying, gravity isn't applied, switch to falling - elseif not inside_fly_node and self.object:get_acceleration().y == 0 then + --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)) end @@ -218,27 +216,27 @@ end local random_pitch_multiplier = {-1,1} -- states are executed here -local fly_state_execution = function(self,dtime) +local swim_state_execution = function(self,dtime) local pos = self.object:get_pos() pos.y = pos.y + self.object:get_properties().collisionbox[5] local current_node = minetest_get_node(pos).name - local inside_fly_node = false + local inside_swim_node = false - --quick scan everything to see if inside fly node - for _,id in pairs(self.fly_in) do + --quick scan everything to see if inside swim node + for _,id in pairs(self.swim_in) do if id == current_node then - inside_fly_node = true + inside_swim_node = true break end end --turn gravity on or off - fly_physics_swapper(self,inside_fly_node) + swim_physics_swapper(self,inside_swim_node) - --fly properly if inside fly node - if inside_fly_node then + --swim properly if inside swim node + if inside_swim_node then if self.state == "stand" then @@ -250,9 +248,9 @@ local fly_state_execution = function(self,dtime) --print("standing") - mobs.set_fly_velocity(self,0) + mobs.set_swim_velocity(self,0) - elseif self.state == "fly" then + elseif self.state == "swim" then self.walk_timer = self.walk_timer - dtime @@ -270,9 +268,9 @@ local fly_state_execution = function(self,dtime) end - mobs.set_fly_velocity(self,self.walk_velocity) + mobs.set_swim_velocity(self,self.walk_velocity) end - --flop around if not inside fly node + --flop around if not inside swim node else --print("flopping") flop(self,dtime) @@ -304,10 +302,10 @@ mobs.mob_step = function(self, dtime) - --swimming/flying - if self.fly then - fly_state_switch(self, dtime) - fly_state_execution(self, dtime) + --swimming + if self.swim then + swim_state_switch(self, dtime) + swim_state_execution(self, dtime) --regular mobs that walk around else land_state_switch(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 72f93ea242..0cf6a6ab23 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -11,6 +11,17 @@ local vector_multiply = vector.multiply local minetest_yaw_to_dir = minetest.yaw_to_dir + +--[[ + _ _ +| | | | +| | __ _ _ __ __| | +| | / _` | '_ \ / _` | +| |___| (_| | | | | (_| | +\_____/\__,_|_| |_|\__,_| +]] + + -- move mob in facing direction --this has been modified to be internal --internal = lua (self.yaw) @@ -71,6 +82,22 @@ mobs.jump = function(self, velocity) self.object:add_velocity(vector_new(0,velocity,0)) end + + + + +--[[ + _____ _ +/ ___| (_) +\ `--.__ ___ _ __ ___ + `--. \ \ /\ / / | '_ ` _ \ +/\__/ /\ V V /| | | | | | | +\____/ \_/\_/ |_|_| |_| |_| +]]-- + + + + --make mobs flop mobs.flop = function(self, velocity) @@ -106,7 +133,7 @@ end --this has been modified to be internal --internal = lua (self.yaw) --engine = c++ (self.object:get_yaw()) -mobs.set_fly_velocity = function(self, v) +mobs.set_swim_velocity = function(self, v) local yaw = (self.yaw or 0) local pitch = (self.pitch or 0) diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index f650472fc7..09fa8b1283 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -48,8 +48,7 @@ mobs:register_mob("mobs_mc:squid", { }, visual_size = {x=3, y=3}, makes_footstep_sound = false, - fly = true, - fly_in = { mobs_mc.items.water_source, "mcl_core:water_flowing", mobs_mc.items.river_water_source }, + swim = true, breathes_in_water = true, jump = false, view_range = 16, From e8148f81ab7641554096bc03ecda8927d9ad9491 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 12:36:19 -0400 Subject: [PATCH 064/176] Make underwater mobs try to continuously swim around with quick_rotate_45 --- .../mcl_mobs/api/mob_functions/ai.lua | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 794f8d2f16..9550fcac76 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -13,6 +13,15 @@ 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_45 = function(self,dtime) + self.yaw = self.yaw + THIRTY_SECONDTH_PI + if self.yaw > DOUBLE_PI then + self.yaw = self.yaw - DOUBLE_PI + end +end + + --[[ _ _ | | | | @@ -43,14 +52,6 @@ local cliff_check = function(self,dtime) return free_fall end ---a simple helper function which is too small to move into movement.lua -local quick_rotate_45 = function(self,dtime) - self.yaw = self.yaw + THIRTY_SECONDTH_PI - if self.yaw > DOUBLE_PI then - self.yaw = self.yaw - DOUBLE_PI - end -end - --check if a mob needs to jump local jump_check = function(self,dtime) @@ -101,9 +102,6 @@ end -- states are executed here local land_state_execution = function(self,dtime) - --local yaw = self.object:get_yaw() or 0 - - if self.state == "stand" then --do animation @@ -136,6 +134,7 @@ local land_state_execution = function(self,dtime) local node_in_front_of = jump_check(self) if node_in_front_of == 1 then + mobs.jump(self) --turn if on the edge of cliff @@ -195,7 +194,27 @@ local swim_state_switch = function(self, dtime) 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 collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector_multiply(dir, radius) + + 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 + --this is going to need some more logic gates because birds can flop around +--REMOVE THIS - just dump mobs.flop into where this was local flop = function(self,dtime) mobs.flop(self) end @@ -243,11 +262,6 @@ local swim_state_execution = function(self,dtime) --do animation --mobs.set_mob_animation(self, "stand") - --set the velocity of the mob - --mobs.set_velocity(self,0) - - --print("standing") - mobs.set_swim_velocity(self,0) elseif self.state == "swim" then @@ -266,6 +280,13 @@ local swim_state_execution = function(self,dtime) --create a truly random pitch, since there is no easy access to pitch math that I can find self.pitch = math_random() * random_pitch_multiplier[math_random(1,2)] end + + + --do a quick turn to make mob continuously move + --if in a fish tank or something + if swim_turn_check(self,dtime) then + quick_rotate_45(self,dtime) + end mobs.set_swim_velocity(self,self.walk_velocity) @@ -298,10 +319,6 @@ mobs.mob_step = function(self, dtime) return false end - --print(self.object:get_yaw()) - - - --swimming if self.swim then swim_state_switch(self, dtime) From 240d6ea21155f2044d3b728a210811821540013a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 12:37:04 -0400 Subject: [PATCH 065/176] Add note about quick_rotate_45 actually rotating 11.25 degrees --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 9550fcac76..daf163174e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -14,6 +14,7 @@ local THIRTY_SECONDTH_PI = DOUBLE_PI * 0.03125 --a simple helper function which is too small to move into movement.lua +--this rotates 11.25 degrees, probably should rename it eventually local quick_rotate_45 = function(self,dtime) self.yaw = self.yaw + THIRTY_SECONDTH_PI if self.yaw > DOUBLE_PI then From 07841c89632626f1c3bb4790f8db0c2adddfb2eb Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 12:38:48 -0400 Subject: [PATCH 066/176] Swap name of quick_rotate_45 to quick_rotate --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index daf163174e..c4e8f32860 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -14,8 +14,7 @@ local THIRTY_SECONDTH_PI = DOUBLE_PI * 0.03125 --a simple helper function which is too small to move into movement.lua ---this rotates 11.25 degrees, probably should rename it eventually -local quick_rotate_45 = function(self,dtime) +local quick_rotate = function(self,dtime) self.yaw = self.yaw + THIRTY_SECONDTH_PI if self.yaw > DOUBLE_PI then self.yaw = self.yaw - DOUBLE_PI @@ -146,7 +145,7 @@ local land_state_execution = function(self,dtime) --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_45(self,dtime) + quick_rotate(self,dtime) --stop the mob so it doesn't fall off mobs.set_velocity(self,0) end @@ -286,7 +285,7 @@ local swim_state_execution = function(self,dtime) --do a quick turn to make mob continuously move --if in a fish tank or something if swim_turn_check(self,dtime) then - quick_rotate_45(self,dtime) + quick_rotate(self,dtime) end From f2e909ab8d182febabbdacd9de50a65f27137761 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 12:41:14 -0400 Subject: [PATCH 067/176] Add in fly logic gate --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index c4e8f32860..41d33e89b0 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -323,6 +323,9 @@ mobs.mob_step = function(self, dtime) if self.swim then swim_state_switch(self, dtime) swim_state_execution(self, dtime) + --flying + elseif self.fly then + print("I probably should be flying >:(") --regular mobs that walk around else land_state_switch(self, dtime) From 8783912938aed1f5566f3e2f5056213f0cefe4a6 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 12:48:57 -0400 Subject: [PATCH 068/176] Add in mobs api swimming animation --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 41d33e89b0..e558716feb 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -213,12 +213,6 @@ local swim_turn_check = function(self,dtime) return(green_flag_1) end ---this is going to need some more logic gates because birds can flop around ---REMOVE THIS - just dump mobs.flop into where this was -local flop = function(self,dtime) - mobs.flop(self) -end - --this is to swap the built in engine acceleration modifier local swim_physics_swapper = function(self,inside_swim_node) @@ -260,7 +254,7 @@ local swim_state_execution = function(self,dtime) if self.state == "stand" then --do animation - --mobs.set_mob_animation(self, "stand") + mobs.set_mob_animation(self, "stand") mobs.set_swim_velocity(self,0) @@ -281,20 +275,23 @@ local swim_state_execution = function(self,dtime) self.pitch = math_random() * random_pitch_multiplier[math_random(1,2)] end + --do animation + mobs.set_mob_animation(self, "walk") --do a quick turn to make mob continuously move --if in a fish tank or something if swim_turn_check(self,dtime) then quick_rotate(self,dtime) end - mobs.set_swim_velocity(self,self.walk_velocity) end --flop around if not inside swim node else - --print("flopping") - flop(self,dtime) + --do animation + mobs.set_mob_animation(self, "stand") + + mobs.flop(self) end end From 0794bc54372c6aaa9c653693da3a18194adf5c95 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 13:04:55 -0400 Subject: [PATCH 069/176] Make flying mobs float in water and lava --- .../mcl_mobs/api/mob_functions/ai.lua | 133 +++++++++++++++++- .../mcl_mobs/api/mob_functions/movement.lua | 70 +++++++++ 2 files changed, 199 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index e558716feb..2cbde73244 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -29,7 +29,7 @@ end | | / _` | '_ \ / _` | | |___| (_| | | | | (_| | \_____/\__,_|_| |_|\__,_| -]] +]]-- --this is basically reverse jump_check local cliff_check = function(self,dtime) @@ -290,13 +290,137 @@ local swim_state_execution = function(self,dtime) else --do animation mobs.set_mob_animation(self, "stand") - + mobs.flop(self) end end +--[[ +______ _ +| ___| | +| |_ | |_ _ +| _| | | | | | +| | | | |_| | +\_| |_|\__, | + __/ | + |___/ +]]-- + +-- state switching logic (stand, walk, run, attacks) +local fly_state_list_wandering = {"stand", "fly"} + +local fly_state_switch = function(self, dtime) + self.state_timer = self.state_timer - dtime + if self.wandering and self.state_timer <= 0 then + self.state_timer = math.random(4,10) + math.random() + self.state = fly_state_list_wandering[math.random(1,#fly_state_list_wandering)] + end +end + + +--check if a mob needs to turn while flyming +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 collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector_multiply(dir, radius) + + 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 + +--this is to swap the built in engine acceleration modifier +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)) + --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)) + end +end + + +local random_pitch_multiplier = {-1,1} +-- states are executed here +local fly_state_execution = function(self,dtime) + + local pos = self.object:get_pos() + pos.y = pos.y + self.object:get_properties().collisionbox[5] + local current_node = minetest_get_node(pos).name + local inside_fly_node = minetest_get_item_group(current_node, "solid") == 0 + + --recheck if in water or lava + if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then + inside_fly_node = false + end + + --turn gravity on or off + fly_physics_swapper(self,inside_fly_node) + + --fly properly if inside fly node + if inside_fly_node then + if self.state == "stand" then + + --do animation + mobs.set_mob_animation(self, "stand") + + mobs.set_fly_velocity(self,0) + + elseif self.state == "fly" 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)) + + --create a truly random pitch, since there is no easy access to pitch math that I can find + self.pitch = math_random() * random_pitch_multiplier[math_random(1,2)] + end + + --do animation + mobs.set_mob_animation(self, "walk") + + --do a quick turn to make mob continuously move + --if in a bird cage or something + if fly_turn_check(self,dtime) then + quick_rotate(self,dtime) + end + + mobs.set_fly_velocity(self,self.walk_velocity) + end + else + --make the mob float + if self.floats and minetest_get_item_group(current_node, "water") ~= 0 then + mobs.float(self) + end + end +end + + + + + + + --[[ ___ ___ _ _ _ | \/ | (_) | | (_) @@ -306,7 +430,7 @@ ___ ___ _ _ _ \_| |_/\__,_|_|_| |_| \_____/\___/ \__, |_|\___| __/ | |___/ -]] +]]-- --the main loop mobs.mob_step = function(self, dtime) @@ -322,7 +446,8 @@ mobs.mob_step = function(self, dtime) swim_state_execution(self, dtime) --flying elseif self.fly then - print("I probably should be flying >:(") + fly_state_switch(self, dtime) + fly_state_execution(self,dtime) --regular mobs that walk around else land_state_switch(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 0cf6a6ab23..76e0fe7d5d 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -12,6 +12,31 @@ local vector_multiply = vector.multiply local minetest_yaw_to_dir = minetest.yaw_to_dir + +--this is a generic float function +mobs.float = function(self) + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = 0, + y = 5, + z = 0, + } + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + new_velocity_addition.x = 0 + new_velocity_addition.z = 0 + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + + + --[[ _ _ | | | | @@ -151,6 +176,51 @@ mobs.set_swim_velocity = function(self, 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))) + end + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + +--[[ +______ _ +| ___| | +| |_ | |_ _ +| _| | | | | | +| | | | |_| | +\_| |_|\__, | + __/ | + |___/ +]]-- + +-- move mob in facing direction +--this has been modified to be internal +--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) + + if v == 0 then + pitch = 0 + end + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = (math_sin(yaw) * -v), + y = pitch, + 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 From a20f272e08f0170b2761eeba2a12aeaf88efad7b Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 13:05:53 -0400 Subject: [PATCH 070/176] re-adjust logic gate for mobs floating in water and lava --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 2cbde73244..8eae204b36 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -362,9 +362,11 @@ local fly_state_execution = function(self,dtime) local current_node = minetest_get_node(pos).name local inside_fly_node = minetest_get_item_group(current_node, "solid") == 0 + local float_now = false --recheck if in water or lava if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then inside_fly_node = false + float_now = true end --turn gravity on or off @@ -409,7 +411,7 @@ local fly_state_execution = function(self,dtime) end else --make the mob float - if self.floats and minetest_get_item_group(current_node, "water") ~= 0 then + if self.floats and float_now then mobs.float(self) end end From 58d9670e777c3798c676924023375a2579450142 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 13:11:39 -0400 Subject: [PATCH 071/176] Remove collisionbox addition for y position for fly mobs --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 8eae204b36..2c9467278b 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -102,6 +102,18 @@ end -- states are executed here local land_state_execution = function(self,dtime) + local pos = self.object:get_pos() + local collisionbox = self.object:get_properties().collisionbox + --get the center of the mob + pos.y = pos.y + (collisionbox[2] + collisionbox[5] / 2) + local current_node = minetest_get_node(pos).name + local float_now = false + + --recheck if in water or lava + if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then + float_now = true + end + if self.state == "stand" then --do animation @@ -166,6 +178,9 @@ local land_state_execution = function(self,dtime) end + if float_now then + mobs.float(self) + end end @@ -356,9 +371,7 @@ end local random_pitch_multiplier = {-1,1} -- states are executed here local fly_state_execution = function(self,dtime) - local pos = self.object:get_pos() - pos.y = pos.y + self.object:get_properties().collisionbox[5] local current_node = minetest_get_node(pos).name local inside_fly_node = minetest_get_item_group(current_node, "solid") == 0 From d9729fc8651d06566e61bcfcb2e7df0484f25f48 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 13:13:45 -0400 Subject: [PATCH 072/176] Fix parrot's rotation --- mods/ENTITIES/mobs_mc/parrot.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index 5efcb191b4..81d19d5d46 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -24,6 +24,7 @@ mobs:register_mob("mobs_mc:parrot", { mesh = "mobs_mc_parrot.b3d", textures = {{"mobs_mc_parrot_blue.png"},{"mobs_mc_parrot_green.png"},{"mobs_mc_parrot_grey.png"},{"mobs_mc_parrot_red_blue.png"},{"mobs_mc_parrot_yellow_blue.png"}}, visual_size = {x=3, y=3}, + rotate = 270, walk_velocity = 3, run_velocity = 5, sounds = { From 5ade34115cff228994ff3fd680aa15c8225ab6e7 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 13:17:29 -0400 Subject: [PATCH 073/176] Remove random state initialization in set_up.lua --- mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua | 3 --- 1 file changed, 3 deletions(-) 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 1d48d52f70..1fee55217d 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -2,8 +2,6 @@ local math_random = math.random local minetest_settings = minetest.settings -local state_randomization = {"stand", "walk"} - -- get entity staticdata mobs.mob_staticdata = function(self) @@ -26,7 +24,6 @@ mobs.mob_staticdata = function(self) self.remove_ok = true self.attack = nil self.following = nil - self.state = state_randomization[math.random(1,#state_randomization)] if use_cmi then self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) From 3cf263d292f9fc5a7a18fafa2aa1fbc8e1840a0a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 16:23:38 -0400 Subject: [PATCH 074/176] Add in dynamic pitch in flying/swimming mobs --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + .../mcl_mobs/api/mob_functions/ai.lua | 16 +++++ .../mcl_mobs/api/mob_functions/animation.lua | 64 ++++++++++++++++++- 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 47804b0d00..1c3ca79b84 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -313,6 +313,7 @@ function mobs:register_mob(name, def) gravity = GRAVITY, swim = def.swim, swim_in = def.swim_in or {mobs_mc.items.water_source, "mcl_core:water_flowing", mobs_mc.items.river_water_source}, + pitch_switch = "static", --set_animation = mobs.set_animation, --end j4i stuff diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 2c9467278b..fe7b0309f2 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -1,4 +1,5 @@ local math_random = math.random +local math_pi = math.pi local vector_multiply = vector.multiply local vector_add = vector.add @@ -273,6 +274,8 @@ local swim_state_execution = function(self,dtime) mobs.set_swim_velocity(self,0) + mobs.set_static_pitch(self) + elseif self.state == "swim" then self.walk_timer = self.walk_timer - dtime @@ -300,6 +303,8 @@ local swim_state_execution = function(self,dtime) end mobs.set_swim_velocity(self,self.walk_velocity) + + mobs.set_dynamic_pitch(self) end --flop around if not inside swim node else @@ -307,6 +312,8 @@ local swim_state_execution = function(self,dtime) mobs.set_mob_animation(self, "stand") mobs.flop(self) + + mobs.set_static_pitch(self) end end @@ -394,6 +401,8 @@ local fly_state_execution = function(self,dtime) mobs.set_fly_velocity(self,0) + mobs.set_static_pitch(self) + elseif self.state == "fly" then self.walk_timer = self.walk_timer - dtime @@ -420,12 +429,18 @@ local fly_state_execution = function(self,dtime) quick_rotate(self,dtime) end + mobs.set_dynamic_pitch(self) + mobs.set_fly_velocity(self,self.walk_velocity) end else --make the mob float if self.floats and float_now then + mobs.set_velocity(self, 0) + mobs.float(self) + + mobs.set_static_pitch(self) end end end @@ -476,4 +491,5 @@ mobs.mob_step = function(self, dtime) end self.old_velocity = self.object:get_velocity() + self.old_pos = self.object:get_pos() end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index 2f89333dab..8d37b7c090 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -1,4 +1,19 @@ local math_pi = math.pi +local math_floor = math.floor +local HALF_PI = math_pi/2 + + + +local vector_distance = vector.distance +local vector_new = vector.new + +local minetest_dir_to_yaw = minetest.dir_to_yaw + + +-- simple degrees calculation +local degrees = function(yaw) + return(yaw*180.0/math_pi) +end -- set defined animation mobs.set_mob_animation = function(self, anim, fixed_frame) @@ -67,8 +82,8 @@ mobs.death_effect = function(pos, yaw, collisionbox, rotate) time = 0.001, minpos = vector.add(pos, min), maxpos = vector.add(pos, max), - minvel = vector.new(-5,-5,-5), - maxvel = vector.new(5,5,5), + minvel = vector_new(-5,-5,-5), + maxvel = vector_new(5,5,5), minexptime = 1.1, maxexptime = 1.5, minsize = 1, @@ -102,4 +117,49 @@ mobs.movement_rotation_lock = function(self) elseif math.abs(current_engine_yaw - current_lua_yaw) > 0.05 and self.object:get_properties().automatic_face_movement_dir == false then self.object:set_properties{automatic_face_movement_dir = self.rotate} end +end + + +local calculate_pitch = function(self) + local pos = self.object:get_pos() + local pos2 = self.old_pos + + if pos == nil or pos2 == nil then + 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) +end + +--this is a helper function used to make mobs pitch rotation dynamically flow when flying/swimming +mobs.set_dynamic_pitch = function(self) + local pitch = calculate_pitch(self) + + if not pitch then + return + end + + local current_rotation = self.object:get_rotation() + + current_rotation.x = pitch + + self.object:set_rotation(current_rotation) + + self.pitch_switch = "dynamic" +end + +--this is a helper function used to make mobs pitch rotation reset when flying/swimming +mobs.set_static_pitch = function(self) + + if self.pitch_switch == "static" then + return + end + + local current_rotation = self.object:get_rotation() + + current_rotation.x = 0 + current_rotation.z = 0 + + self.object:set_rotation(current_rotation) + self.pitch_switchfdas = "static" end \ No newline at end of file From e2987245fd6c6ee75383ea92da30e9fc5e10ad1e Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 17:00:34 -0400 Subject: [PATCH 075/176] Balance out collision forces for mobs --- mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua | 6 ------ mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua | 7 ++++++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index 8d37b7c090..97d0f7894e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -9,12 +9,6 @@ local vector_new = vector.new local minetest_dir_to_yaw = minetest.dir_to_yaw - --- simple degrees calculation -local degrees = function(yaw) - return(yaw*180.0/math_pi) -end - -- set defined animation mobs.set_mob_animation = function(self, anim, fixed_frame) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua index e6c89e2dbc..91feeb1927 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua @@ -1,6 +1,7 @@ local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius local math_random = math.random +local vector_multiply = vector.multiply local integer_test = {-1,1} @@ -74,8 +75,12 @@ mobs.collision = function(self) local vel1 = vector.multiply(velocity, -1.5) local vel2 = vector.multiply(velocity, 1.5) - vel1 = vector.multiply(vel1, force) + vel1 = vector.multiply(vel1, force * 10) vel2 = vector.multiply(vel2, force) + + if object:is_player() then + vel2 = vector_multiply(vel2, 2.5) + end self.object:add_velocity(vel1) object:add_velocity(vel2) From db87b8e0a37cd15ef7931a76d21bbb190a158205 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 17:09:57 -0400 Subject: [PATCH 076/176] fix chicken rotation --- mods/ENTITIES/mobs_mc/chicken.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index 246bf216ac..8be3019f6b 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -25,7 +25,7 @@ mobs:register_mob("mobs_mc:chicken", { {"mobs_mc_chicken.png"}, }, visual_size = {x=2.2, y=2.2}, - + rotate = 270, makes_footstep_sound = true, walk_velocity = 1, drops = { From 719bb2a3c96ca020f8f828959e377831f47cd27b Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sat, 17 Apr 2021 18:21:33 -0400 Subject: [PATCH 077/176] Add in prototype jump-only mobs api --- mods/ENTITIES/mcl_mobs/api/api.lua | 2 +- .../mcl_mobs/api/mob_functions/ai.lua | 115 +++++++++++++++++- .../mcl_mobs/api/mob_functions/movement.lua | 48 ++++++++ mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 6 +- 4 files changed, 167 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 1c3ca79b84..79a47a78c5 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -314,7 +314,7 @@ function mobs:register_mob(name, def) swim = def.swim, swim_in = def.swim_in or {mobs_mc.items.water_source, "mcl_core:water_flowing", mobs_mc.items.river_water_source}, pitch_switch = "static", - --set_animation = mobs.set_animation, + jump_only = def.jump_only, --end j4i stuff -- MCL2 extensions diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index fe7b0309f2..ce3e468b3c 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -342,7 +342,7 @@ local fly_state_switch = function(self, dtime) end ---check if a mob needs to turn while flyming +--check if a mob needs to turn while flying local fly_turn_check = function(self,dtime) local pos = self.object:get_pos() @@ -446,8 +446,115 @@ local fly_state_execution = function(self,dtime) end +--[[ + ___ + |_ | + | |_ _ _ __ ___ _ __ + | | | | | '_ ` _ \| '_ \ +/\__/ / |_| | | | | | | |_) | +\____/ \__,_|_| |_| |_| .__/ + | | + |_| +]]-- +--check if a mob needs to turn while jumping +local jump_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 collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector_multiply(dir, radius) + + 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 + +-- state switching logic (stand, jump, run, attacks) +local jump_state_list_wandering = {"stand", "jump"} + +local jump_state_switch = function(self, dtime) + self.state_timer = self.state_timer - dtime + if self.wandering and self.state_timer <= 0 then + self.state_timer = math.random(4,10) + math.random() + self.state = jump_state_list_wandering[math.random(1,#jump_state_list_wandering)] + end +end + +-- states are executed here +local jump_state_execution = function(self,dtime) + + local pos = self.object:get_pos() + local collisionbox = self.object:get_properties().collisionbox + --get the center of the mob + pos.y = pos.y + (collisionbox[2] + collisionbox[5] / 2) + local current_node = minetest_get_node(pos).name + + local float_now = false + + --recheck if in water or lava + if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then + float_now = true + end + + if self.state == "stand" then + + --do animation + mobs.set_mob_animation(self, "stand") + + --set the velocity of the mob + mobs.set_velocity(self,0) + + elseif self.state == "jump" then + + self.walk_timer = self.walk_timer - dtime + + --reset the jump timer + if self.walk_timer <= 0 then + + --re-randomize the jump timer + self.walk_timer = math.random(1,6) + math.random() + + --set the mob into a random direction + self.yaw = (math_random() * (math.pi * 2)) + end + + --do animation + mobs.set_mob_animation(self, "walk") + + --enable rotation locking + mobs.movement_rotation_lock(self) + + --jumping mobs are more loosey goosey + if node_in_front_of == 1 then + quick_rotate(self,dtime) + end + + --only move forward if path is clear + mobs.jump_move(self,self.walk_velocity) + + elseif self.state == "run" then + + print("run") + + elseif self.state == "attack" then + + print("attack") + + end + + if float_now then + mobs.float(self) + end +end + @@ -470,8 +577,12 @@ mobs.mob_step = function(self, dtime) return false end + --jump only (like slimes) + if self.jump_only then + jump_state_switch(self, dtime) + jump_state_execution(self, dtime) --swimming - if self.swim then + elseif self.swim then swim_state_switch(self, dtime) swim_state_execution(self, dtime) --flying diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 76e0fe7d5d..1ff7809512 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -221,6 +221,54 @@ mobs.set_fly_velocity = function(self, 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))) + end + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + + +--[[ + ___ + |_ | + | |_ _ _ __ ___ _ __ + | | | | | '_ ` _ \| '_ \ +/\__/ / |_| | | | | | | |_) | +\____/ \__,_|_| |_| |_| .__/ + | | + |_| +]]-- + +--special mob jump movement +mobs.jump_move = function(self, velocity) + + if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then + return + end + + --make the mob stick for a split second + mobs.set_velocity(self,0) + + --fallback velocity to allow modularity + jump_height = 8 + + local yaw = (self.yaw or 0) + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = (math_sin(yaw) * -velocity), + y = jump_height, + 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 diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 6c8000a50d..1926ce89df 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -64,6 +64,7 @@ local slime_big = { hp_max = 16, xp_min = 4, xp_max = 4, + rotate = 270, collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, visual_size = {x=12.5, y=12.5}, textures = {{"mobs_mc_slime.png"}}, @@ -100,6 +101,7 @@ local slime_big = { view_range = 16, attack_type = "dogfight", passive = false, + jump_only = true, jump = true, walk_velocity = 2.5, run_velocity = 2.5, @@ -311,6 +313,7 @@ local magma_cube_big = { }, walk_velocity = 4, run_velocity = 4, + rotate = 270, damage = 6, reach = 3, armor = 53, @@ -337,12 +340,13 @@ local magma_cube_big = { }, water_damage = 0, lava_damage = 0, - fire_damage = 0, + fire_damage = 0, light_damage = 0, fall_damage = 0, view_range = 16, attack_type = "dogfight", passive = false, + jump_only = true, jump = true, jump_height = 8, walk_chance = 0, From 1920ddf91530a7c033c8288cd3a752f3ee7ba850 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 18 Apr 2021 21:02:03 -0400 Subject: [PATCH 078/176] Change all enemy attack info to more workable and understandable attacks --- mods/ENTITIES/mobs_mc/blaze.lua | 2 +- mods/ENTITIES/mobs_mc/ender_dragon.lua | 2 +- mods/ENTITIES/mobs_mc/endermite.lua | 1 + mods/ENTITIES/mobs_mc/ghast.lua | 2 +- mods/ENTITIES/mobs_mc/guardian.lua | 2 +- mods/ENTITIES/mobs_mc/guardian_elder.lua | 2 +- mods/ENTITIES/mobs_mc/polar_bear.lua | 2 +- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- mods/ENTITIES/mobs_mc/silverfish.lua | 2 +- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 2 +- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 2 +- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 4 ++-- mods/ENTITIES/mobs_mc/spider.lua | 2 +- mods/ENTITIES/mobs_mc/vex.lua | 2 +- mods/ENTITIES/mobs_mc/villager_evoker.lua | 2 +- mods/ENTITIES/mobs_mc/villager_illusioner.lua | 2 +- mods/ENTITIES/mobs_mc/villager_vindicator.lua | 2 +- mods/ENTITIES/mobs_mc/villager_zombie.lua | 2 +- mods/ENTITIES/mobs_mc/witch.lua | 2 +- mods/ENTITIES/mobs_mc/wither.lua | 2 +- mods/ENTITIES/mobs_mc/zombie.lua | 2 +- mods/ENTITIES/mobs_mc/zombiepig.lua | 2 +- 22 files changed, 23 insertions(+), 22 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 847e2f4a53..d7e0a5c48f 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -63,7 +63,7 @@ mobs:register_mob("mobs_mc:blaze", { fall_speed = -2.25, light_damage = 0, view_range = 16, - attack_type = "dogshoot", + attack_type = "projectile", arrow = "mobs_mc:blaze_fireball", shoot_interval = 3.5, shoot_offset = 1.0, diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index a6f4042754..ec31be35c3 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -46,7 +46,7 @@ mobs:register_mob("mobs_mc:enderdragon", { lava_damage = 0, fire_damage = 0, on_rightclick = nil, - attack_type = "dogshoot", + attack_type = "projectile", arrow = "mobs_mc:dragon_fireball", shoot_interval = 0.5, shoot_offset = -1.0, diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua index da3922a106..e413f65b30 100644 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ b/mods/ENTITIES/mobs_mc/endermite.lua @@ -14,6 +14,7 @@ mobs:register_mob("mobs_mc:endermite", { xp_max = 3, armor = {fleshy = 100, arthropod = 100}, group_attack = true, + attack_type = "punch", collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.29, 0.2}, visual = "mesh", mesh = "mobs_mc_endermite.b3d", diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 83a10bfc40..8a800b7882 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -49,7 +49,7 @@ mobs:register_mob("mobs_mc:ghast", { }, fall_damage = 0, view_range = 100, - attack_type = "dogshoot", + attack_type = "projectile", arrow = "mobs_mc:fireball", shoot_interval = 3.5, shoot_offset = -5, diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index 13c857ea39..086338da82 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -13,7 +13,7 @@ mobs:register_mob("mobs_mc:guardian", { xp_max = 10, breath_max = -1, passive = false, - attack_type = "dogfight", + attack_type = "punch", pathfinding = 1, view_range = 16, walk_velocity = 2, diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index 089f6e38f7..087e85353a 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -15,7 +15,7 @@ mobs:register_mob("mobs_mc:guardian_elder", { xp_max = 10, breath_max = -1, passive = false, - attack_type = "dogfight", + attack_type = "punch", pathfinding = 1, view_range = 16, walk_velocity = 2, diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index 5d2853f6d2..f1772be997 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -30,7 +30,7 @@ mobs:register_mob("mobs_mc:polar_bear", { walk_velocity = 1.2, run_velocity = 2.4, group_attack = true, - attack_type = "dogfight", + attack_type = "punch", drops = { -- 3/4 chance to drop raw fish (poor approximation) {name = mobs_mc.items.fish_raw, diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 8000d0937b..b6a4a61991 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -14,7 +14,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:shulker", { type = "monster", spawn_class = "hostile", - attack_type = "shoot", + attack_type = "projectile", shoot_interval = 0.5, arrow = "mobs_mc:shulkerbullet", shoot_offset = 0.5, diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index 433211503b..6ed9e6dca7 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -43,7 +43,7 @@ mobs:register_mob("mobs_mc:silverfish", { run_start = 0, run_end = 20, }, view_range = 16, - attack_type = "dogfight", + attack_type = "punch", damage = 1, reach = 1, }) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index b43873b2aa..da3df4664b 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -84,7 +84,7 @@ local skeleton = { ignited_by_sunlight = true, view_range = 16, fear_height = 4, - attack_type = "dogshoot", + attack_type = "projectile", arrow = "mcl_bows:arrow_entity", shoot_arrow = function(self, pos, dir) if mod_bows then diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index da472d6057..c539e476b8 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -85,7 +85,7 @@ mobs:register_mob("mobs_mc:witherskeleton", { fire_damage = 0, light_damage = 0, view_range = 16, - attack_type = "dogfight", + attack_type = "punch", dogshoot_switch = 1, dogshoot_count_max =0.5, fear_height = 4, diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 1926ce89df..b29ccd454a 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -99,7 +99,7 @@ local slime_big = { }, fall_damage = 0, view_range = 16, - attack_type = "dogfight", + attack_type = "jump_punch", passive = false, jump_only = true, jump = true, @@ -344,7 +344,7 @@ local magma_cube_big = { light_damage = 0, fall_damage = 0, view_range = 16, - attack_type = "dogfight", + attack_type = "jump_punch", passive = false, jump_only = true, jump = true, diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index bb5e29eb1f..95179310b6 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -17,7 +17,7 @@ local spider = { spawn_class = "hostile", passive = false, docile_by_day = true, - attack_type = "dogfight", + attack_type = "punch", pathfinding = 1, damage = 2, reach = 2, diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index cccdebe7a5..c2ce2a87a6 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -14,7 +14,7 @@ mobs:register_mob("mobs_mc:vex", { spawn_class = "hostile", pathfinding = 1, passive = false, - attack_type = "dogfight", + attack_type = "punch", physical = false, hp_min = 14, hp_max = 14, diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index abe0e9ca2b..86338eb143 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -34,7 +34,7 @@ mobs:register_mob("mobs_mc:evoker", { walk_velocity = 0.2, run_velocity = 1.4, group_attack = true, - attack_type = "dogfight", + attack_type = "punch", -- Summon vexes custom_attack = function(self, to_attack) local r = pr:next(2,4) diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index 0bbe2a5f6d..e4642c847c 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -9,7 +9,7 @@ local mod_bows = minetest.get_modpath("mcl_bows") ~= nil mobs:register_mob("mobs_mc:illusioner", { type = "monster", spawn_class = "hostile", - attack_type = "shoot", + attack_type = "projectile", shoot_interval = 2.5, shoot_offset = 1.5, arrow = "mcl_bows:arrow_entity", diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua index 56b295066b..19b2c7a7f6 100644 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ b/mods/ENTITIES/mobs_mc/villager_vindicator.lua @@ -36,7 +36,7 @@ mobs:register_mob("mobs_mc:vindicator", { reach = 2, walk_velocity = 1.2, run_velocity = 2.4, - attack_type = "dogfight", + attack_type = "punch", drops = { {name = mobs_mc.items.emerald, chance = 1, diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index 325cf5955b..f6eff6e0ab 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -51,7 +51,7 @@ mobs:register_mob("mobs_mc:villager_zombie", { reach = 2, walk_velocity = 1.2, run_velocity = 2.4, - attack_type = "dogfight", + attack_type = "punch", group_attack = true, drops = { {name = mobs_mc.items.rotten_flesh, diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index f9f9b8d1f0..83174313fb 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -33,7 +33,7 @@ mobs:register_mob("mobs_mc:witch", { run_velocity = 2.4, pathfinding = 1, group_attack = true, - attack_type = "dogshoot", + attack_type = "projectile", arrow = "mobs_mc:potion_arrow", shoot_interval = 2.5, shoot_offset = 1, diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 2d53cc547f..6a63b2f821 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -52,7 +52,7 @@ mobs:register_mob("mobs_mc:wither", { }, lava_damage = 0, fire_damage = 0, - attack_type = "dogshoot", + attack_type = "projectile", explosion_strength = 8, dogshoot_stop = true, arrow = "mobs_mc:wither_skull", diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index fed83f233a..4d88b25772 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -88,7 +88,7 @@ local zombie = { ignited_by_sunlight = true, sunlight_damage = 2, view_range = 16, - attack_type = "dogfight", + attack_type = "punch", harmed_by_heal = true, } diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index ebd8ce4856..efaf1b3967 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -20,7 +20,7 @@ local pigman = { xp_min = 6, xp_max = 6, armor = {undead = 90, fleshy = 90}, - attack_type = "dogfight", + attack_type = "punch", group_attack = { "mobs_mc:pigman", "mobs_mc:baby_pigman" }, damage = 9, reach = 2, From 39985aa558d9f43a6a2e82fb6d59ad0ca8b6324d Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 18 Apr 2021 21:22:21 -0400 Subject: [PATCH 079/176] Up fallback max xp to 3 --- mods/ENTITIES/mcl_mobs/api/api.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 79a47a78c5..67865da6eb 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -58,7 +58,7 @@ local DEATH_DELAY = 0.5 local DEFAULT_FALL_SPEED = -10 local FLOP_HEIGHT = 5.0 local FLOP_HOR_SPEED = 1.5 -local GRAVITY = minetest_settings:get("movement_gravity") + 9.81 +local GRAVITY = minetest_settings:get("movement_gravity")-- + 9.81 local MOB_CAP = {} @@ -215,7 +215,7 @@ function mobs:register_mob(name, def) hp_min = scale_difficulty(def.hp_min, 5, 1), hp_max = scale_difficulty(def.hp_max, 10, 1), xp_min = def.xp_min or 0, - xp_max = def.xp_max or 0, + xp_max = def.xp_max or 3, xp_timestamp = 0, breath_max = def.breath_max or 15, breathes_in_water = def.breathes_in_water or false, @@ -298,7 +298,10 @@ function mobs:register_mob(name, def) runaway_from = def.runaway_from, owner_loyal = def.owner_loyal, facing_fence = false, + + _cmi_is_mob = true, + pushable = def.pushable or true, --j4i stuff From 4d589dfb2aa10cb664b4d3b3471960e6d648b92c Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 18 Apr 2021 21:22:39 -0400 Subject: [PATCH 080/176] Remove literally unneeded mobs:capture_mob --- mods/ENTITIES/extra_mobs/strider.lua | 3 --- mods/ENTITIES/mcl_mobs/api.txt | 17 ----------------- .../api/mob_functions/backup_code_api.lua | 7 ------- .../mcl_mobs/api/mob_functions/interaction.lua | 9 +++++---- .../mcl_mobs/api/mob_functions/movement.lua | 11 +++++++---- mods/ENTITIES/mobs_mc/chicken.lua | 1 - mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 4 +--- mods/ENTITIES/mobs_mc/horse.lua | 5 +---- mods/ENTITIES/mobs_mc/llama.lua | 5 +---- mods/ENTITIES/mobs_mc/ocelot.lua | 1 - mods/ENTITIES/mobs_mc/parrot.lua | 1 - mods/ENTITIES/mobs_mc/pig.lua | 4 ---- mods/ENTITIES/mobs_mc/rabbit.lua | 1 - mods/ENTITIES/mobs_mc/sheep.lua | 1 - mods/ENTITIES/mobs_mc/wolf.lua | 2 -- 15 files changed, 15 insertions(+), 57 deletions(-) diff --git a/mods/ENTITIES/extra_mobs/strider.lua b/mods/ENTITIES/extra_mobs/strider.lua index 1847161565..6796bdca21 100644 --- a/mods/ENTITIES/extra_mobs/strider.lua +++ b/mods/ENTITIES/extra_mobs/strider.lua @@ -190,9 +190,6 @@ local strider = { inv:set_stack("main",self.driver:get_wield_index(), wielditem) end return - - elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then - mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end, } diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index eda74aeb42..0e4810b0fd 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -502,20 +502,6 @@ and damages any entity caught inside the blast radius. Protection will limit node destruction but not entity damage. -mobs:capture_mob ----------------- - -mobs:capture_mob(...) - -Does nothing and returns false. - -This function is provided for compability with Mobs Redo for an attempt to -capture a mob. -Mobs cannot be captured in MineClone 2. - -In Mobs Redo, this is generally called inside the on_rightclick section of the mob -api code, it provides a chance of capturing the mob. See Mobs Redo documentation -of parameters. Feeding and Taming/Breeding --------------------------- @@ -781,8 +767,5 @@ mobs:register_mob("mob_horse:horse", { inv:remove_item("main", "mobs:saddle") end end - - -- used to capture horse with magic lasso - mobs:capture_mob(self, clicker, 0, 0, 80, false, nil) end }) 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.lua index 292a27ec0d..d7b2291479 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua @@ -112,13 +112,6 @@ function mobs:spawn_child(pos, mob_type) end --- No-op in MCL2 (capturing mobs is not possible). --- Provided for compability with Mobs Redo -function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) - return false -end - - -- No-op in MCL2 (protecting mobs is not possible). function mobs:protect(self, clicker) return false diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index b996867cf8..490ae85182 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -1,5 +1,10 @@ +mobs.feed_tame = function(self) + return nil +end + -- Code to execute before custom on_rightclick handling local on_rightclick_prefix = function(self, clicker) + local item = clicker:get_wielded_item() -- Name mob with nametag @@ -32,8 +37,4 @@ mobs.create_mob_on_rightclick = function(on_rightclick) on_rightclick(self, clicker) end end -end - -mobs.feed_tame = function(self) - return nil end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 1ff7809512..f983734ebe 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -11,6 +11,9 @@ local vector_multiply = vector.multiply local minetest_yaw_to_dir = minetest.yaw_to_dir +local DEFAULT_JUMP_HEIGHT = 5 +local DEFAULT_FLOAT_SPEED = 4 + --this is a generic float function @@ -20,7 +23,7 @@ mobs.float = function(self) local goal_velocity = { x = 0, - y = 5, + y = DEFAULT_FLOAT_SPEED, z = 0, } @@ -102,7 +105,7 @@ mobs.jump = function(self, velocity) end --fallback velocity to allow modularity - velocity = velocity or 8 + velocity = velocity or DEFAULT_JUMP_HEIGHT self.object:add_velocity(vector_new(0,velocity,0)) end @@ -133,7 +136,7 @@ mobs.flop = function(self, velocity) mobs.set_velocity(self, 0) --fallback velocity to allow modularity - velocity = velocity or 8 + velocity = velocity or DEFAULT_JUMP_HEIGHT --create a random direction (2d yaw) local dir = DOUBLE_PI * math_random() @@ -256,7 +259,7 @@ mobs.jump_move = function(self, velocity) mobs.set_velocity(self,0) --fallback velocity to allow modularity - jump_height = 8 + jump_height = DEFAULT_JUMP_HEIGHT local yaw = (self.yaw or 0) diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index 8be3019f6b..3d7ba8606e 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -70,7 +70,6 @@ mobs:register_mob("mobs_mc:chicken", { on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, true) then return end if mobs:protect(self, clicker) then return end - if mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end end, do_custom = function(self, dtime) diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index be4cceea37..9ad7b2a182 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -71,7 +71,6 @@ local cow_def = { end return end - mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end, follow = mobs_mc.items.wheat, view_range = 10, @@ -139,8 +138,7 @@ mooshroom_def.on_rightclick = function(self, clicker) pos.y = pos.y + 0.5 minetest.add_item(pos, {name = mobs_mc.items.mushroom_stew}) end - end - mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) + end end mobs:register_mob("mobs_mc:mooshroom", mooshroom_def) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 938a6b6ace..b9d79a0752 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -355,10 +355,7 @@ local horse = { self.object:set_properties({stepheight = 1.1}) mobs.attach(self, clicker) - - -- Used to capture horse - elseif not self.driver and iname ~= "" then - mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) + end end end, diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 8ff82b502a..5951f9dffb 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -182,10 +182,7 @@ mobs:register_mob("mobs_mc:llama", { self.object:set_properties({stepheight = 1.1}) mobs.attach(self, clicker) end - - -- Used to capture llama - elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then - mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) + end end, diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index f3c8c87ae1..139b687853 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -121,7 +121,6 @@ cat.sounds = { } cat.on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, false) then return end - if mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end if mobs:protect(self, clicker) then return end if self.child then return end diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index 81d19d5d46..06a2dc18ba 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -86,7 +86,6 @@ mobs:register_mob("mobs_mc:parrot", { -- Feed to tame, but not breed if mobs:feed_tame(self, clicker, 1, false, true) then return end if mobs:protect(self, clicker) then return end - if mobs:capture_mob(self, clicker, 0, 50, 80, false, nil) then return end end, }) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index b7cdf1afe9..da7e686ada 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -163,10 +163,6 @@ mobs:register_mob("mobs_mc:pig", { inv:set_stack("main",self.driver:get_wield_index(), wielditem) end return - - -- Capture pig - elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then - mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end, diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index 74bdffcd80..0f67bb7d7c 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -62,7 +62,6 @@ local rabbit = { -- Feed, tame protect or capture if mobs:feed_tame(self, clicker, 1, true, true) then return end if mobs:protect(self, clicker) then return end - if mobs:capture_mob(self, clicker, 0, 50, 80, false, nil) then return end end, do_custom = function(self) -- Easter egg: Change texture if rabbit is named “Toast” diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index d82df8cf9d..8ba8aecd8f 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -251,7 +251,6 @@ mobs:register_mob("mobs_mc:sheep", { end return end - if mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end end, on_breed = function(parent1, parent2) -- Breed sheep and choose a fur color for the child. diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index b1c077d465..319a4f9594 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -149,8 +149,6 @@ dog.on_rightclick = function(self, clicker) if mobs:protect(self, clicker) then return - elseif item:get_name() ~= "" and mobs:capture_mob(self, clicker, 0, 2, 80, false, nil) then - return elseif is_food(item:get_name()) then -- Feed to increase health local hp = self.health From 85e531bf106df326b2ca470b5a94aeb06f92d4d6 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 18 Apr 2021 21:24:31 -0400 Subject: [PATCH 081/176] Remove unneeded mobs:protect from code --- mods/ENTITIES/extra_mobs/strider.lua | 1 - mods/ENTITIES/mcl_mobs/api.txt | 13 ------------- .../mcl_mobs/api/mob_functions/backup_code_api.lua | 5 ----- mods/ENTITIES/mobs_mc/chicken.lua | 1 - mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 2 -- mods/ENTITIES/mobs_mc/horse.lua | 6 +----- mods/ENTITIES/mobs_mc/llama.lua | 3 +-- mods/ENTITIES/mobs_mc/ocelot.lua | 1 - mods/ENTITIES/mobs_mc/parrot.lua | 1 - mods/ENTITIES/mobs_mc/pig.lua | 1 - mods/ENTITIES/mobs_mc/rabbit.lua | 1 - mods/ENTITIES/mobs_mc/sheep.lua | 1 - mods/ENTITIES/mobs_mc/wolf.lua | 4 +--- 13 files changed, 3 insertions(+), 37 deletions(-) diff --git a/mods/ENTITIES/extra_mobs/strider.lua b/mods/ENTITIES/extra_mobs/strider.lua index 6796bdca21..d6c8542077 100644 --- a/mods/ENTITIES/extra_mobs/strider.lua +++ b/mods/ENTITIES/extra_mobs/strider.lua @@ -124,7 +124,6 @@ local strider = { if wielditem:get_name() ~= controlitem then if mobs:feed_tame(self, clicker, 1, true, true) then return end end - if mobs:protect(self, clicker) then return end if self.child then return diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 0e4810b0fd..5d49ca7efa 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -521,19 +521,6 @@ Will return true when mob is fed with item it likes. them up -Protecting Mobs ---------------- - -mobs:protect(self, clicker) - -This function can be used to right-click any tamed mob with mobs:protector item, -this will protect the mob from harm inside of a protected area from other -players. Will return true when mob right-clicked with mobs:protector item. - - 'self' mob information - 'clicker' player information - - Riding Mobs ----------- 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.lua index d7b2291479..2c1ba19832 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua @@ -112,11 +112,6 @@ function mobs:spawn_child(pos, mob_type) end --- No-op in MCL2 (protecting mobs is not possible). -function mobs:protect(self, clicker) - return false -end - -- feeding, taming and breeding (thanks blert2112) function mobs:feed_tame(self, clicker, feed_count, breed, tame) diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index 3d7ba8606e..2fe82293e3 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -69,7 +69,6 @@ mobs:register_mob("mobs_mc:chicken", { on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, true) then return end - if mobs:protect(self, clicker) then return end end, do_custom = function(self, dtime) diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 9ad7b2a182..59b80ecb92 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -50,7 +50,6 @@ local cow_def = { follow = mobs_mc.follow.cow, on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, true) then return end - if mobs:protect(self, clicker) then return end if self.child then return @@ -86,7 +85,6 @@ mooshroom_def.mesh = "mobs_mc_cow.b3d" mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } } mooshroom_def.on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, true) then return end - if mobs:protect(self, clicker) then return end if self.child then return diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index b9d79a0752..0e0246d4e4 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -281,10 +281,6 @@ local horse = { return end - if mobs:protect(self, clicker) then - return - end - -- Make sure tamed horse is mature and being clicked by owner only if self.tamed and not self.child and self.owner == clicker:get_player_name() then @@ -355,7 +351,7 @@ local horse = { self.object:set_properties({stepheight = 1.1}) mobs.attach(self, clicker) - + end end end, diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 5951f9dffb..e0c353ad8b 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -133,7 +133,6 @@ mobs:register_mob("mobs_mc:llama", { -- Feed with anything else if mobs:feed_tame(self, clicker, 1, false, true) then return end end - if mobs:protect(self, clicker) then return end -- Make sure tamed llama is mature and being clicked by owner only if self.tamed and not self.child and self.owner == clicker:get_player_name() then @@ -182,7 +181,7 @@ mobs:register_mob("mobs_mc:llama", { self.object:set_properties({stepheight = 1.1}) mobs.attach(self, clicker) end - + end end, diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index 139b687853..bb62a54fab 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -121,7 +121,6 @@ cat.sounds = { } cat.on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, false) then return end - if mobs:protect(self, clicker) then return end if self.child then return end diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index 06a2dc18ba..ef82884aa6 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -85,7 +85,6 @@ mobs:register_mob("mobs_mc:parrot", { -- Feed to tame, but not breed if mobs:feed_tame(self, clicker, 1, false, true) then return end - if mobs:protect(self, clicker) then return end end, }) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index da7e686ada..2751a8bebd 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -95,7 +95,6 @@ mobs:register_mob("mobs_mc:pig", { if wielditem:get_name() ~= mobs_mc.items.carrot_on_a_stick then if mobs:feed_tame(self, clicker, 1, true, true) then return end end - if mobs:protect(self, clicker) then return end if self.child then return diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index 0f67bb7d7c..a7d5d02d95 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -61,7 +61,6 @@ local rabbit = { on_rightclick = function(self, clicker) -- Feed, tame protect or capture if mobs:feed_tame(self, clicker, 1, true, true) then return end - if mobs:protect(self, clicker) then return end end, do_custom = function(self) -- Easter egg: Change texture if rabbit is named “Toast” diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 8ba8aecd8f..e6368a3f8a 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -195,7 +195,6 @@ mobs:register_mob("mobs_mc:sheep", { local item = clicker:get_wielded_item() if mobs:feed_tame(self, clicker, 1, true, true) then return end - if mobs:protect(self, clicker) then return end if item:get_name() == mobs_mc.items.shears and not self.gotten and not self.child then self.gotten = true diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 319a4f9594..00a41b6855 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -147,9 +147,7 @@ dog.specific_attack = nil dog.on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - if mobs:protect(self, clicker) then - return - elseif is_food(item:get_name()) then + if is_food(item:get_name()) then -- Feed to increase health local hp = self.health local hp_add = 0 From d8d4cb5defcbe1ca1b71100441cc6636557752c8 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 19 Apr 2021 14:44:20 +0200 Subject: [PATCH 082/176] Revert color changes to GUI. The Minecraft colorset (net.minecraft.util.text.TextFormatting) is only used for chat and tooltips. This partically reverts 84819bf9f5164ab208b7be1e94d142906359a1af. --- mods/ENTITIES/mobs_mc/mod.conf | 2 +- mods/ENTITIES/mobs_mc/villager.lua | 18 ++++++++--------- mods/HELP/doc/doc/init.lua | 10 +++++----- mods/HELP/doc/doc/mod.conf | 1 - mods/HELP/mcl_craftguide/init.lua | 2 +- mods/HUD/awards/api.lua | 4 ++-- mods/HUD/mcl_inventory/creative.lua | 2 +- mods/HUD/mcl_inventory/init.lua | 4 ++-- mods/HUD/mcl_inventory/mod.conf | 2 +- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 4 ++-- mods/ITEMS/REDSTONE/mcl_dispensers/mod.conf | 2 +- mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 4 ++-- mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua | 4 ++-- mods/ITEMS/REDSTONE/mcl_droppers/mod.conf | 2 +- mods/ITEMS/mcl_anvils/init.lua | 4 ++-- mods/ITEMS/mcl_anvils/mod.conf | 2 +- mods/ITEMS/mcl_brewing/init.lua | 8 ++++---- mods/ITEMS/mcl_brewing/mod.conf | 2 +- mods/ITEMS/mcl_chests/init.lua | 20 +++++++++---------- mods/ITEMS/mcl_chests/mod.conf | 2 +- mods/ITEMS/mcl_crafting_table/init.lua | 2 +- mods/ITEMS/mcl_enchanting/engine.lua | 8 ++++---- mods/ITEMS/mcl_furnaces/init.lua | 8 ++++---- mods/ITEMS/mcl_furnaces/mod.conf | 2 +- mods/ITEMS/mcl_hoppers/init.lua | 4 ++-- mods/ITEMS/mcl_hoppers/mod.conf | 2 +- 26 files changed, 62 insertions(+), 63 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/mod.conf b/mods/ENTITIES/mobs_mc/mod.conf index a3057faff9..98f48b388a 100644 --- a/mods/ENTITIES/mobs_mc/mod.conf +++ b/mods/ENTITIES/mobs_mc/mod.conf @@ -1,6 +1,6 @@ name = mobs_mc author = maikerumine description = Adds Minecraft-like monsters and animals. -depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip, mcl_colors +depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip optional_depends = default, mcl_tnt, mcl_bows, mcl_throwing, mcl_fishing, bones, mesecons_materials, mobs_mc_gameconfig, doc_items diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index d251ba8239..ab79edfec0 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -516,7 +516,7 @@ local function show_trade_formspec(playername, trader, tradenum) "size[9,8.75]" .."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]" ..disabled_img - .."label[4,0;"..F(minetest.colorize(mcl_colors.DARK_GRAY, S(profession))).."]" + .."label[4,0;"..F(minetest.colorize("#313131", S(profession))).."]" .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" ..b_prev..b_next @@ -1075,8 +1075,8 @@ mobs:register_mob("mobs_mc:villager", { mobs:spawn_specific( -"mobs_mc:villager", -"overworld", +"mobs_mc:villager", +"overworld", "ground", { "FlowerForest", @@ -1096,12 +1096,12 @@ mobs:spawn_specific( "ExtremeHillsM", "BirchForestM", }, -0, -minetest.LIGHT_MAX+1, -30, -20, -4, -mobs_mc.spawn_height.water+1, +0, +minetest.LIGHT_MAX+1, +30, +20, +4, +mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) -- spawn eggs diff --git a/mods/HELP/doc/doc/init.lua b/mods/HELP/doc/doc/init.lua index 9057cda8e4..029914a532 100644 --- a/mods/HELP/doc/doc/init.lua +++ b/mods/HELP/doc/doc/init.lua @@ -35,10 +35,10 @@ doc.FORMSPEC.ENTRY_HEIGHT = doc.FORMSPEC.ENTRY_END_Y - doc.FORMSPEC.ENTRY_START_ -- Internal helper variables local DOC_INTRO = S("This is the help.") -local COLOR_NOT_VIEWED = mcl_colors.AQUA -local COLOR_VIEWED = mcl_colors.WHITE -local COLOR_HIDDEN = mcl_colors.GRAY -local COLOR_ERROR = mcl_colors.RED +local COLOR_NOT_VIEWED = "#00FFFF" -- cyan +local COLOR_VIEWED = "#FFFFFF" -- white +local COLOR_HIDDEN = "#999999" -- gray +local COLOR_ERROR = "#FF0000" -- red local CATEGORYFIELDSIZE = { WIDTH = math.ceil(doc.FORMSPEC.WIDTH / 4), @@ -770,7 +770,7 @@ function doc.generate_entry_list(cid, playername) if name == nil or name == "" then name = S("Nameless entry (@1)", eid) if doc.entry_viewed(playername, cid, eid) then - viewedprefix = mcl_colors.RED + viewedprefix = "#FF4444" else viewedprefix = COLOR_ERROR end diff --git a/mods/HELP/doc/doc/mod.conf b/mods/HELP/doc/doc/mod.conf index 54064551bb..0f65ddff7e 100644 --- a/mods/HELP/doc/doc/mod.conf +++ b/mods/HELP/doc/doc/mod.conf @@ -2,4 +2,3 @@ name = doc author = Wuzzy description = A simple in-game documentation system which enables mods to add help entries based on templates. optional_depends = unified_inventory, sfinv_buttons, central_message, inventory_plus -depends = mcl_colors diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index e10513bc3d..d05d8b3d07 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -667,7 +667,7 @@ local function make_formspec(name) fs[#fs + 1] = fmt("label[%f,%f;%s]", sfinv_only and 6.3 or data.iX - 2.2, 0.22, - ESC(colorize(mcl_colors.DARK_GRAY, fmt("%s / %u", data.pagenum, data.pagemax)))) + ESC(colorize("#383838", fmt("%s / %u", data.pagenum, data.pagemax)))) fs[#fs + 1] = fmt([[ image_button[%f,0.12;0.8,0.8;craftguide_prev_icon.png;prev;] diff --git a/mods/HUD/awards/api.lua b/mods/HUD/awards/api.lua index 6601dd6265..d795f0dcac 100644 --- a/mods/HUD/awards/api.lua +++ b/mods/HUD/awards/api.lua @@ -447,7 +447,7 @@ function awards.getFormspec(name, to, sid) first = false if def.secret and not award.got then - formspec = formspec .. mcl_colors.DARK_GRAY..minetest.formspec_escape(S("(Secret Award)")) + formspec = formspec .. "#707070" .. minetest.formspec_escape(S("(Secret Award)")) else local title = award.name if def and def.title then @@ -456,7 +456,7 @@ function awards.getFormspec(name, to, sid) if award.got then formspec = formspec .. minetest.formspec_escape(title) else - formspec = formspec .. mcl_colors.GRAY.. minetest.formspec_escape(title) + formspec = formspec .. "#ACACAC" .. minetest.formspec_escape(title) end end end diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index a69fcef5be..b3ee40bf7f 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -442,7 +442,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz end local caption = "" if name ~= "inv" and filtername[name] then - caption = "label[0,1.2;"..F(minetest.colorize(mcl_colors.DARK_GRAY, filtername[name])).."]" + caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" end formspec = "size[10,9.3]".. diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index e9da9486e7..0544240515 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -109,10 +109,10 @@ local function set_inventory(player, armor_change_only) mcl_formspec.get_itemslot_bg(0,3,1,1).. armor_slot_imgs.. -- craft and inventory - "label[0,4;"..F(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. - "label[4,0.5;"..F(minetest.colorize(mcl_colors.DARK_GRAY, S("Crafting"))).."]".. + "label[4,0.5;"..F(minetest.colorize("#313131", S("Crafting"))).."]".. "list[current_player;craft;4,1;2,2]".. "list[current_player;craftpreview;7,1.5;1,1;]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. diff --git a/mods/HUD/mcl_inventory/mod.conf b/mods/HUD/mcl_inventory/mod.conf index edd6343c7b..fa6b2c2f46 100644 --- a/mods/HUD/mcl_inventory/mod.conf +++ b/mods/HUD/mcl_inventory/mod.conf @@ -1,6 +1,6 @@ name = mcl_inventory author = BlockMen description = Adds the player inventory and creative inventory. -depends = mcl_init, mcl_formspec, mcl_colors +depends = mcl_init, mcl_formspec optional_depends = mcl_player, _mcl_autogroup, mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 1fd63cb4d5..b6d0d2ef69 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -13,12 +13,12 @@ local S = minetest.get_translator("mcl_dispensers") local setup_dispenser = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[3,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Dispenser"))).."]".. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dispenser"))).."]".. "list[current_name;main;3,0.5;3,3;]".. mcl_formspec.get_itemslot_bg(3,0.5,3,3).. "listring[current_name;main]".. diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/mod.conf b/mods/ITEMS/REDSTONE/mcl_dispensers/mod.conf index ac1b56c7d9..13cdb5f5a5 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/mod.conf +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/mod.conf @@ -1,3 +1,3 @@ name = mcl_dispensers -depends = mcl_init, mcl_formspec, mesecons, mcl_sounds, mcl_tnt, mcl_worlds, mcl_core, mcl_nether, mcl_armor_stand, mcl_armor, mcl_colors +depends = mcl_init, mcl_formspec, mesecons, mcl_sounds, mcl_tnt, mcl_worlds, mcl_core, mcl_nether, mcl_armor_stand, mcl_armor optional_depends = doc, screwdriver diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index 0d41c3552a..715a85f3d7 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -14,12 +14,12 @@ local S = minetest.get_translator("mcl_droppers") local setup_dropper = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[3,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Dropper"))).."]".. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]".. "list[current_name;main;3,0.5;3,3;]".. mcl_formspec.get_itemslot_bg(3,0.5,3,3).. "listring[current_name;main]".. diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua index b41d9c2fee..1bf968a825 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua @@ -15,10 +15,10 @@ local setup_dropper = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. - "label[3,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Dropper"))).."]".. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]".. "list[current_name;main;3,0.5;3,3;]".. "listring[current_name;main]".. "listring[current_player;main]" diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/mod.conf b/mods/ITEMS/REDSTONE/mcl_droppers/mod.conf index b5cf8f0b71..bbb1c19f24 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/mod.conf +++ b/mods/ITEMS/REDSTONE/mcl_droppers/mod.conf @@ -1,3 +1,3 @@ name = mcl_droppers -depends = mcl_init, mcl_formspec, mesecons, mcl_util, mcl_colors +depends = mcl_init, mcl_formspec, mesecons, mcl_util optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 1845ed7767..c3c238e7f9 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -16,7 +16,7 @@ local function get_anvil_formspec(set_name) end return "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;mcl_anvils_inventory.png]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -27,7 +27,7 @@ local function get_anvil_formspec(set_name) mcl_formspec.get_itemslot_bg(4,2.5,1,1).. "list[context;output;8,2.5;1,1;]".. mcl_formspec.get_itemslot_bg(8,2.5,1,1).. - "label[3,0.1;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Repair and Name"))).."]".. + "label[3,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Repair and Name"))).."]".. "field[3.25,1;4,1;name;;"..minetest.formspec_escape(set_name).."]".. "field_close_on_enter[name;false]".. "button[7,0.7;2,1;name_button;"..minetest.formspec_escape(S("Set Name")).."]".. diff --git a/mods/ITEMS/mcl_anvils/mod.conf b/mods/ITEMS/mcl_anvils/mod.conf index cbb5dc2231..cd4fa02a83 100644 --- a/mods/ITEMS/mcl_anvils/mod.conf +++ b/mods/ITEMS/mcl_anvils/mod.conf @@ -1,5 +1,5 @@ name = mcl_anvils author = Wuzzy description = Anvils mods for MCL2 -depends = mcl_init, mcl_formspec, mcl_sounds, tt, mcl_enchanting, mcl_colors +depends = mcl_init, mcl_formspec, mcl_sounds, tt, mcl_enchanting optional_depends = mcl_core, screwdriver diff --git a/mods/ITEMS/mcl_brewing/init.lua b/mods/ITEMS/mcl_brewing/init.lua index 78ccd8ed9f..617929ff73 100644 --- a/mods/ITEMS/mcl_brewing/init.lua +++ b/mods/ITEMS/mcl_brewing/init.lua @@ -4,8 +4,8 @@ local function active_brewing_formspec(fuel_percent, brew_percent) return "size[9,8.75]".. "background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]".. - "label[4,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Brewing Stand"))).."]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[4,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Brewing Stand"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.75;9,1;]".. @@ -35,8 +35,8 @@ end local brewing_formspec = "size[9,8.75]".. "background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]".. - "label[4,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Brewing Stand"))).."]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[4,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Brewing Stand"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.75;9,1;]".. diff --git a/mods/ITEMS/mcl_brewing/mod.conf b/mods/ITEMS/mcl_brewing/mod.conf index 160319c936..2c27c979e7 100644 --- a/mods/ITEMS/mcl_brewing/mod.conf +++ b/mods/ITEMS/mcl_brewing/mod.conf @@ -1,4 +1,4 @@ name = mcl_brewing author = bzoss -depends = mcl_init, mcl_formspec, mcl_sounds, mcl_potions, mcl_mobitems, mcl_colors +depends = mcl_init, mcl_formspec, mcl_sounds, mcl_potions, mcl_mobitems optional_depends = mcl_core, doc, screwdriver diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 05a6d18181..824530eb34 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -475,10 +475,10 @@ minetest.register_node(small_name, { minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -624,12 +624,12 @@ minetest.register_node(left_name, { minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. @@ -773,12 +773,12 @@ minetest.register_node("mcl_chests:"..basename.."_right", { "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. @@ -986,10 +986,10 @@ minetest.register_node("mcl_chests:ender_chest", { }) local formspec_ender_chest = "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Ender Chest"))).."]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Ender Chest"))).."]".. "list[current_player;enderchest;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -1107,10 +1107,10 @@ local function formspec_shulker_box(name) name = S("Shulker Box") end return "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. "list[current_name;main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. diff --git a/mods/ITEMS/mcl_chests/mod.conf b/mods/ITEMS/mcl_chests/mod.conf index 609b1fff98..0ff5129ca2 100644 --- a/mods/ITEMS/mcl_chests/mod.conf +++ b/mods/ITEMS/mcl_chests/mod.conf @@ -1,3 +1,3 @@ name = mcl_chests -depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_end, mesecons, mcl_colors +depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_end, mesecons optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_crafting_table/init.lua b/mods/ITEMS/mcl_crafting_table/init.lua index 6df4c2544e..cbf1cff349 100644 --- a/mods/ITEMS/mcl_crafting_table/init.lua +++ b/mods/ITEMS/mcl_crafting_table/init.lua @@ -2,7 +2,7 @@ local S = minetest.get_translator("mcl_crafting_table") local formspec_escape = minetest.formspec_escape local show_formspec = minetest.show_formspec local C = minetest.colorize -local text_color = mcl_colors.DARK_GRAY +local text_color = "#313131" local itemslot_bg = mcl_formspec.get_itemslot_bg mcl_crafting_table = {} diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index f3bfea12b0..3243b78796 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -469,13 +469,13 @@ function mcl_enchanting.show_enchanting_formspec(player) local formspec = "" .. "size[9.07,8.6;]" .. "formspec_version[3]" - .. "label[0,0;" .. C(mcl_colors.DARK_GRAY) .. F(table_name) .. "]" + .. "label[0,0;" .. C("#313131") .. F(table_name) .. "]" .. mcl_formspec.get_itemslot_bg(0.2, 2.4, 1, 1) .. "list[current_player;enchanting_item;0.2,2.4;1,1]" .. mcl_formspec.get_itemslot_bg(1.1, 2.4, 1, 1) .. "image[1.1,2.4;1,1;mcl_enchanting_lapis_background.png]" .. "list[current_player;enchanting_lapis;1.1,2.4;1,1]" - .. "label[0,4;" .. C(mcl_colors.DARK_GRAY) .. F(S("Inventory")).."]" + .. "label[0,4;" .. C("#313131") .. F(S("Inventory")).."]" .. mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3) .. mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1) .. "list[current_player;main;0,4.5;9,3;9]" @@ -502,11 +502,11 @@ function mcl_enchanting.show_enchanting_formspec(player) local hover_ending = (can_enchant and "_hovered" or "_off") formspec = formspec .. "container[3.2," .. y .. "]" - .. (slot and "tooltip[button_" .. i .. ";" .. C(mcl_colors.GRAY) .. ((slot.description and F(slot.description)) or "") .. " " .. C(mcl_colors.WHITE) .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and mcl_colors.GRAY or mcl_colors.RED) .. F(S("@1 Lapis Lazuli", i)) .. "\n" .. C(mcl_colors.GRAY) .. F(S("@1 Enchantment Levels", i)) or C(mcl_colors.RED) .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "") + .. (slot and "tooltip[button_" .. i .. ";" .. C("#818181") .. ((slot.description and F(slot.description)) or "") .. " " .. C("#FFFFFF") .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and "#818181" or "#FC5454") .. F(S("@1 Lapis Lazuli", i)) .. "\n" .. C("#818181") .. F(S("@1 Enchantment Levels", i)) or C("#FC5454") .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "") .. "style[button_" .. i .. ";bgimg=mcl_enchanting_button" .. ending .. ".png;bgimg_hovered=mcl_enchanting_button" .. hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]" .. "button[0,0;7.5,1.3;button_" .. i .. ";]" .. (slot and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "") - .. (slot and "label[7.2,1.1;" .. C(can_enchant and mcl_colors.GREEN or mcl_colors.DARK_GREEN) .. slot.level_requirement .. "]" or "") + .. (slot and "label[7.2,1.1;" .. C(can_enchant and "#80FF20" or "#407F10") .. slot.level_requirement .. "]" or "") .. (slot and slot.glyphs or "") .. "container_end[]" y = y + 1.35 diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 02a104bc53..af2a609527 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -9,12 +9,12 @@ local LIGHT_ACTIVE_FURNACE = 13 local function active_formspec(fuel_percent, item_percent) return "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Furnace"))).."]".. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. "list[current_name;src;2.75,0.5;1,1;]".. mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. "list[current_name;fuel;2.75,2.5;1,1;]".. @@ -38,12 +38,12 @@ local function active_formspec(fuel_percent, item_percent) end local inactive_formspec = "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Furnace"))).."]".. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. "list[current_name;src;2.75,0.5;1,1;]".. mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. "list[current_name;fuel;2.75,2.5;1,1;]".. diff --git a/mods/ITEMS/mcl_furnaces/mod.conf b/mods/ITEMS/mcl_furnaces/mod.conf index 99a1ad0bf9..fe0b9c2081 100644 --- a/mods/ITEMS/mcl_furnaces/mod.conf +++ b/mods/ITEMS/mcl_furnaces/mod.conf @@ -1,3 +1,3 @@ name = mcl_furnaces -depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles, mcl_colors +depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index e9f6ddf923..eaff8f83de 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -4,10 +4,10 @@ local S = minetest.get_translator("mcl_hoppers") local mcl_hoppers_formspec = "size[9,7]".. - "label[2,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Hopper"))).."]".. + "label[2,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Hopper"))).."]".. "list[current_name;main;2,0.5;5,1;]".. mcl_formspec.get_itemslot_bg(2,0.5,5,1).. - "label[0,2;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,2;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,2.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,2.5,9,3).. "list[current_player;main;0,5.74;9,1;]".. diff --git a/mods/ITEMS/mcl_hoppers/mod.conf b/mods/ITEMS/mcl_hoppers/mod.conf index 53f514f392..c89292f6b4 100644 --- a/mods/ITEMS/mcl_hoppers/mod.conf +++ b/mods/ITEMS/mcl_hoppers/mod.conf @@ -1,4 +1,4 @@ name = mcl_hoppers description = It's just a clone of Minecraft hoppers, functions nearly identical to them minus mesecons making them stop and the way they're placed. -depends = mcl_core, mcl_formspec, mcl_sounds, mcl_util, mcl_colors +depends = mcl_core, mcl_formspec, mcl_sounds, mcl_util optional_depends = doc, screwdriver From 7efc177188b1f6dc2d03704ca9a032a7e7ee5480 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 19 Apr 2021 15:16:59 +0200 Subject: [PATCH 083/176] Revert minecraft color set usage in mcl_books and mcl_skins GUI menus. (Follow-up of d8d4cb5defcbe1ca1b71100441cc6636557752c8) Reverts a2fcd28a3dcbf1aaa07c9f2c21ba7cd3872b7cd4 and partially reverts f8a627915e17779bec1a52fe867877036c043f72. --- mods/ITEMS/mcl_books/init.lua | 6 +++--- mods/ITEMS/mcl_books/mod.conf | 2 +- mods/PLAYER/mcl_skins/init.lua | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 5101994e9d..144cce1b45 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -67,7 +67,7 @@ local make_description = function(title, author, generation) else desc = S("Tattered Book") end - desc = desc .. "\n" .. minetest.colorize(mcl_colors.GRAY, S("by @1", author)) + desc = desc .. "\n" .. minetest.colorize("#AAAAAA", S("by @1", author)) return desc end @@ -147,8 +147,8 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) local formspec = "size[8,9]".. header.. "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "field[0.75,1;7.25,1;title;"..minetest.formspec_escape(minetest.colorize(mcl_colors.BLACK, S("Enter book title:")))..";]".. - "label[0.75,1.5;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("by @1", name))).."]".. + "field[0.75,1;7.25,1;title;"..minetest.formspec_escape(minetest.colorize("#000000", S("Enter book title:")))..";]".. + "label[0.75,1.5;"..minetest.formspec_escape(minetest.colorize("#404040", S("by @1", name))).."]".. "button_exit[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign and Close")).."]".. "tooltip[sign;"..minetest.formspec_escape(S("Note: The book will no longer be editable after signing")).."]".. "button[4.25,7.95;3,1;cancel;"..minetest.formspec_escape(S("Cancel")).."]" diff --git a/mods/ITEMS/mcl_books/mod.conf b/mods/ITEMS/mcl_books/mod.conf index cea9a5dd8d..7c4513b00c 100644 --- a/mods/ITEMS/mcl_books/mod.conf +++ b/mods/ITEMS/mcl_books/mod.conf @@ -1,4 +1,4 @@ name = mcl_books author = celeron55 description = Books mod for MCL2 -optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye, mcl_colors +optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 297817fac0..0b508adc69 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -239,7 +239,7 @@ end) mcl_skins.show_formspec = function(playername) local formspec = "size[7,8.5]" - formspec = formspec .. "label[2,2;" .. minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Select player skin:"))) .. "]" + formspec = formspec .. "label[2,2;" .. minetest.formspec_escape(minetest.colorize("#383838", S("Select player skin:"))) .. "]" .. "textlist[0,2.5;6.8,6;skins_set;" local meta @@ -267,7 +267,7 @@ mcl_skins.show_formspec = function(playername) if meta then if meta.name and meta.name ~= "" then - formspec = formspec .. "label[2,0.5;" .. minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Name: @1", meta.name))) .. "]" + formspec = formspec .. "label[2,0.5;" .. minetest.formspec_escape(minetest.colorize("#383838", S("Name: @1", meta.name))) .. "]" end end From c80b1c5140ad7870f4a2eb5c1dea521e12b74778 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 19 Apr 2021 15:19:59 +0200 Subject: [PATCH 084/176] Re-add usage of mcl_colors.GRAY to book descriptions --- mods/ITEMS/mcl_books/init.lua | 2 +- mods/ITEMS/mcl_books/mod.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 144cce1b45..95b45e69e4 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -67,7 +67,7 @@ local make_description = function(title, author, generation) else desc = S("Tattered Book") end - desc = desc .. "\n" .. minetest.colorize("#AAAAAA", S("by @1", author)) + desc = desc .. "\n" .. minetest.colorize(mcl_colors.GRAY, S("by @1", author)) return desc end diff --git a/mods/ITEMS/mcl_books/mod.conf b/mods/ITEMS/mcl_books/mod.conf index 7c4513b00c..cea9a5dd8d 100644 --- a/mods/ITEMS/mcl_books/mod.conf +++ b/mods/ITEMS/mcl_books/mod.conf @@ -1,4 +1,4 @@ name = mcl_books author = celeron55 description = Books mod for MCL2 -optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye +optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye, mcl_colors From 20a4e038f56b374c3a8f348bb2ffce7fdab93923 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 19 Apr 2021 17:40:50 +0200 Subject: [PATCH 085/176] Fix crash when slain by named mob --- mods/HUD/mcl_death_messages/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 8ca6867019..6fd7e0c93a 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -193,7 +193,7 @@ minetest.register_on_dieplayer(function(player, reason) -- Player was slain by potions if not hitter then return end - + local hittername, hittertype, hittersubtype, shooter local hitter_toolname = get_tool_name(hitter:get_wielded_item()) @@ -222,7 +222,7 @@ minetest.register_on_dieplayer(function(player, reason) end hittersubtype = hitter:get_luaentity().name if hittername then - msg = dmsg("murder", name, hittername) + msg = dmsg("murder_hand", name, hittername) elseif hittersubtype ~= nil and hittersubtype ~= "" then msg = mmsg(hittersubtype, name) else @@ -304,4 +304,4 @@ function mcl_death_messages.player_damage(player, message) if dmg_sequence_number >= 65535 then dmg_sequence_number = 0 end -end \ No newline at end of file +end From e8c15867ad805cb994efa24aacb9bc033d830644 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 19 Apr 2021 16:50:21 +0000 Subject: [PATCH 086/176] Add mcl_stripped_varient node def --- mods/ITEMS/mcl_core/nodes_trees.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_trees.lua b/mods/ITEMS/mcl_core/nodes_trees.lua index d2c5443d32..801810dbd7 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) +local register_tree_trunk = function(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, @@ -22,6 +22,7 @@ local register_tree_trunk = function(subname, description_trunk, description_bar on_rotate = on_rotate, _mcl_blast_resistance = 2, _mcl_hardness = 2, + _mcl_stripped_varient = stripped_varient, }) minetest.register_node("mcl_core:"..subname.."_bark", { @@ -37,6 +38,7 @@ local register_tree_trunk = function(subname, description_trunk, description_bar on_rotate = on_rotate, _mcl_blast_resistance = 2, _mcl_hardness = 2, + _mcl_stripped_varient = stripped_varient.."_bark", }) minetest.register_craft({ @@ -214,12 +216,12 @@ end --------------------- -register_tree_trunk("tree", S("Oak Wood"), S("Oak Bark"), S("The trunk of an oak tree."), "default_tree_top.png", "default_tree.png") -register_tree_trunk("darktree", S("Dark Oak Wood"), S("Dark Oak Bark"), S("The trunk of a dark oak tree."), "mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak.png") -register_tree_trunk("acaciatree", S("Acacia Wood"), S("Acacia Bark"), S("The trunk of an acacia."), "default_acacia_tree_top.png", "default_acacia_tree.png") -register_tree_trunk("sprucetree", S("Spruce Wood"), S("Spruce Bark"), S("The trunk of a spruce tree."), "mcl_core_log_spruce_top.png", "mcl_core_log_spruce.png") -register_tree_trunk("birchtree", S("Birch Wood"), S("Birch Bark"), S("The trunk of a birch tree."), "mcl_core_log_birch_top.png", "mcl_core_log_birch.png") -register_tree_trunk("jungletree", S("Jungle Wood"), S("Jungle Bark"), S("The trunk of a jungle tree."), "default_jungletree_top.png", "default_jungletree.png") +register_tree_trunk("tree", S("Oak Wood"), S("Oak Bark"), S("The trunk of an oak tree."), "default_tree_top.png", "default_tree.png", "mcl_core:stripped_oak") +register_tree_trunk("darktree", S("Dark Oak Wood"), S("Dark Oak Bark"), S("The trunk of a dark oak tree."), "mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak.png", "mcl_core:stripped_dark_oak") +register_tree_trunk("acaciatree", S("Acacia Wood"), S("Acacia Bark"), S("The trunk of an acacia."), "default_acacia_tree_top.png", "default_acacia_tree.png", "mcl_core:stripped_acacia") +register_tree_trunk("sprucetree", S("Spruce Wood"), S("Spruce Bark"), S("The trunk of a spruce tree."), "mcl_core_log_spruce_top.png", "mcl_core_log_spruce.png", "mcl_core:stripped_spruce") +register_tree_trunk("birchtree", S("Birch Wood"), S("Birch Bark"), S("The trunk of a birch tree."), "mcl_core_log_birch_top.png", "mcl_core_log_birch.png", "mcl_core:stripped_birch") +register_tree_trunk("jungletree", S("Jungle Wood"), S("Jungle Bark"), S("The trunk of a jungle tree."), "default_jungletree_top.png", "default_jungletree.png", "mcl_core:stripped_jungle") register_stripped_trunk("stripped_oak", S("Stripped Oak Log"), S("Stripped Oak Wood"), S("The stripped trunk of an oak tree."), "mcl_core_stripped_oak_top.png", "mcl_core_stripped_oak_side.png") register_stripped_trunk("stripped_acacia", S("Stripped Acacia Log"), S("Stripped Acacia Wood"), S("The stripped trunk of an acacia tree."), "mcl_core_stripped_acacia_top.png", "mcl_core_stripped_acacia_side.png") From 7a5ce1c7172fa21c007ce8d45eddaf88c91debf0 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 19 Apr 2021 16:53:48 +0000 Subject: [PATCH 087/176] Simplify debarking again --- mods/ITEMS/mcl_tools/init.lua | 41 ++++++++++------------------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index bb9a4873c9..809a492799 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -352,30 +352,6 @@ minetest.register_tool("mcl_tools:shovel_diamond", { }) -- Axes -local make_stripped_trunk_add_wear = function(itemstack, placer) - if not minetest.is_creative_enabled(placer:get_player_name()) then - -- Add wear (as if digging a axey node) - local toolname = itemstack:get_name() - local wear = mcl_autogroup.get_wear(toolname, "axey") - itemstack:add_wear(wear) - end -end - -local stripped_table = { - {"mcl_core:tree", "mcl_core:stripped_oak"}, - {"mcl_core:darktree", "mcl_core:stripped_dark_oak"}, - {"mcl_core:acaciatree", "mcl_core:stripped_acacia"}, - {"mcl_core:birchtree", "mcl_core:stripped_birch"}, - {"mcl_core:sprucetree", "mcl_core:stripped_spruce"}, - {"mcl_core:jungletree", "mcl_core:stripped_jungle"}, - {"mcl_core:tree_bark", "mcl_core:stripped_oak_bark"}, - {"mcl_core:darktree_bark", "mcl_core:stripped_dark_oak_bark"}, - {"mcl_core:acaciatree_bark", "mcl_core:stripped_acacia_bark"}, - {"mcl_core:birchtree_bark", "mcl_core:stripped_birch_bark"}, - {"mcl_core:sprucetree_bark", "mcl_core:stripped_spruce_bark"}, - {"mcl_core:jungletree_bark", "mcl_core:stripped_jungle_bark"}, -} - local make_stripped_trunk = function(itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then return end @@ -390,12 +366,17 @@ local make_stripped_trunk = function(itemstack, placer, pointed_thing) return itemstack end - for _, st in pairs(stripped_table) do - if noddef.name == st[1] then - minetest.swap_node(pointed_thing.under, {name=st[2], param2=node.param2}) - make_stripped_trunk_add_wear(itemstack, placer) - end - end + if noddef._mcl_stripped_varient == nil then + return itemstack + else + minetest.swap_node(pointed_thing.under, {name=noddef._mcl_stripped_varient, param2=node.param2}) + if not minetest.is_creative_enabled(placer:get_player_name()) then + -- Add wear (as if digging a axey node) + local toolname = itemstack:get_name() + local wear = mcl_autogroup.get_wear(toolname, "axey") + itemstack:add_wear(wear) + end + end return itemstack end From f517d828850c8725c2b4695ec740835d0495a604 Mon Sep 17 00:00:00 2001 From: TechDudie Date: Mon, 19 Apr 2021 18:11:48 +0000 Subject: [PATCH 088/176] Add 'mods/ITEMS/mcl_sweet_berry/mod.conf' --- mods/ITEMS/mcl_sweet_berry/mod.conf | 1 + 1 file changed, 1 insertion(+) create mode 100644 mods/ITEMS/mcl_sweet_berry/mod.conf diff --git a/mods/ITEMS/mcl_sweet_berry/mod.conf b/mods/ITEMS/mcl_sweet_berry/mod.conf new file mode 100644 index 0000000000..32dbf5da0e --- /dev/null +++ b/mods/ITEMS/mcl_sweet_berry/mod.conf @@ -0,0 +1 @@ +name=mcl_sweet_berry \ No newline at end of file From b012c3b739e0acffc15f95895c2538c2ceb6c66c Mon Sep 17 00:00:00 2001 From: TechDudie Date: Mon, 19 Apr 2021 18:20:44 +0000 Subject: [PATCH 089/176] Add 'mods/ITEMS/mcl_sweet_berry/init.lua' --- mods/ITEMS/mcl_sweet_berry/init.lua | 75 +++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 mods/ITEMS/mcl_sweet_berry/init.lua diff --git a/mods/ITEMS/mcl_sweet_berry/init.lua b/mods/ITEMS/mcl_sweet_berry/init.lua new file mode 100644 index 0000000000..b943935053 --- /dev/null +++ b/mods/ITEMS/mcl_sweet_berry/init.lua @@ -0,0 +1,75 @@ +minetest.register_craftitem("mc_sweet_berry:sweet_berry", { + description = "Sweet Berry", + inventory_image = "sweet_berry.png", + on_use = minetest.item_eat(2) +}) + +minetest.register_node("mc_sweet_berry:sweet_berry_bush_0", { + drawtype = "plantlike", + tiles = {"sweet_berry_bush_0.png"}, + damage_per_second = 1, + drop = "" +}) +minetest.register_node("mc_sweet_berry:sweet_berry_bush_1", { + drawtype = "plantlike", + tiles = {"sweet_berry_bush_1.png"}, + damage_per_second = 1, + drop = "" +}) +minetest.register_node("mc_sweet_berry:sweet_berry_bush_2", { + drawtype = "plantlike", + tiles = {"sweet_berry_bush_2.png"}, + damage_per_second = 2, + drop = "mc:sweet_berry 2" +}) +minetest.register_node("mc_sweet_berry:sweet_berry_bush_3", { + drawtype = "plantlike", + tiles = {"sweet_berry_bush_3.png"}, + damage_per_second = 2, + drop = "mc:sweet_berry 3" +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:dirt_with_grass"}, + sidelen = 16, + fill_ratio = 0.1, + biomes = {"Taiga","Forest"}, + y_max = mcl_vars.mg_overworld_max, + y_min = mcl_vars.mg_overworld_min, + decoration = "mc_sweet_berry:sweet_berry_bush_2" +}) +minetest.register_abm({ + nodenames = {"mc_sweet_berry:sweet_berry_bush_0"}, + interval = 10.0, + chance = 16, + action = function(pos, node, active_object_count, active_object_count_wider) + minetest.set_node(pos, {name = "mc_sweet_berry:sweet_berry_bush_1"}) + end +}) +minetest.register_abm({ + nodenames = {"mc_sweet_berry:sweet_berry_bush_1"}, + interval = 10.0, + chance = 16, + action = function(pos, node, active_object_count, active_object_count_wider) + minetest.set_node(pos, {name = "mc_sweet_berry:sweet_berry_bush_2"}) + end +}) +minetest.register_abm({ + nodenames = {"mc_sweet_berry:sweet_berry_bush_2"}, + interval = 10.0, + chance = 16, + action = function(pos, node, active_object_count, active_object_count_wider) + minetest.set_node(pos, {name = "mc_sweet_berry:sweet_berry_bush_3"}) + end +}) + +--taken from mc modpack by TechDude/TechDudie + + + + + + + + From 49f8df85eead4a905de610d84d71cd7ea7a0fa00 Mon Sep 17 00:00:00 2001 From: TechDudie Date: Mon, 19 Apr 2021 18:26:59 +0000 Subject: [PATCH 090/176] Upload files to 'mods/ITEMS/mcl_sweet_berry' --- mods/ITEMS/mcl_sweet_berry/sweet_berry.png | Bin 0 -> 479 bytes mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_0.png | Bin 0 -> 449 bytes mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_1.png | Bin 0 -> 782 bytes mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_2.png | Bin 0 -> 791 bytes mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_3.png | Bin 0 -> 855 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/ITEMS/mcl_sweet_berry/sweet_berry.png create mode 100644 mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_0.png create mode 100644 mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_1.png create mode 100644 mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_2.png create mode 100644 mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_3.png diff --git a/mods/ITEMS/mcl_sweet_berry/sweet_berry.png b/mods/ITEMS/mcl_sweet_berry/sweet_berry.png new file mode 100644 index 0000000000000000000000000000000000000000..90729328400df2dd8807dacc2967b10eb25b00d2 GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#j=IQC;7-Auq zoFI{LpyM>-QzxhYiA8hY-+LHxoF%x$r`e?Z#ZzO8g2G0_O^GL7IpnNiYfve>Gn03b z#JPVz7?&lwFv;Jq7ijzVknP1)slVG_Y;N>!Fgav$|Nmdk-lC_yOrdSwXP-aV z$duk7a@eHE$jInMQBhNi1YiCCa|}hiIyDJmwy|Fr)`-ioZE#?`ed64?35%zmU2y2w zu?Z*6^Yd*Gc6FDKkFQ|*u5_bBf$Um(1pyh#tZHKNjWbEK}FgvW` yu#lhW#H_@k7bY>nyI9V6D-;GuEI7?CXU7l_F!7DCPt7V&;Cj0HxvXrS3F=-_UNtJ za<$$v+LWjHz@!sx4Lk`29M(S!nxk3ZHkm56R?l~8--Hv9kchtHFK ze0XDf_`m&s36`lxB=^<*KYZZ$;bRAmojbH)eX@3!oCx0u*8ltdr~LT+O_{mhz?`{% zhr;3I`uip7_WnQef!$-XH;2KWUPan7zyQyS|Yz**H<`q-9B`H6(wZ3WU#tWwo zU2{)eV$i0LvE;+V3{9Ngwmkmm?EtvabPcMlu0VS#c*c(=&hXGh_VRslyh${dngz7maB=Q=(>1 z(0t%t_+YT5nIASQWxnXYX?gc6v8-$M^J+s$SDATIyIGa?~rnM36 z?CLAnGu~yiol3c-UHaxlj=PllhZ(DW`EzgC$)d|=`2EFPjuk)V?l5#IHSRAx?U=i< z&BSx#?(NPghu5`pWb=K>O`X;$;N^F8di&+3$L-x2K6fiUmFy4Q{=J@~ysJs#>Z*2` z;yk0!C)>mW&j<&cc00v)Gv}sX(WdMz^Oxy-@|@tHFa2TFx(KapA_BVw|Lkf%`jYjM z?H%{$^Us^SayVpT;3e|t_GbT=r&>=}KbLh* G2~7Y{PfEN1 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_2.png b/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_2.png new file mode 100644 index 0000000000000000000000000000000000000000..61ac69bfe5c10b2c5be607ee0c065ee395b30fd7 GIT binary patch literal 791 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&Rm5z|`pJ;uvBf zSQ_k|EgUHFFVCpo=ib^{r|tz|m!t&bS4=Tm8@jtdJ0ws%i`(fS`;L$P9S@ueE^d9X zOj}&EC8R6ksPDzF8oivQZ?D+QI+vnmJoEKl^O+IimIcpc&RO2CJjXce!iBfSSIocq z_nD={KmXjI|D)!?A;E`hZiUX-T_1OXMMOQX@4}ZO7ne1%{Co1Hqd;QzsSDkU+g}^@cD)Bw#U*}^bwzMfDW^Tcf$J-tFUw-5RG9RAKH8ZW+2KzCtL zO!1>|ixc-2W;;JxZdp+|;hp^J^>+^+F+4bXae3sW(&tyc-fAoq&M%zaE%2Y|@HO`J TUY}V7L5b4S)z4*}Q$iB}UtwG= literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_3.png b/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a0aff1aa0420e3a04bda82c76139227ad4f70a GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&Rm5z;w{l#WBP} zuypci|6oUvWBYf0-?m-1mO*K$z~W_sE0w$gR!#gMz|4Kf>#&>otPMt4K6ieZOGM7t zQJ9)ErNhup=%9qN$;ZZsI432qwHhL`oL)Y*tI9vV^ZJ&|-g#%|SQ_8YKWAyo{O9dckUjManb*TPR|qAW%vJUS~6L3LJ1f5_IN={&Bhl!U#8F8^0ztmiek3KheFoKM&}WvXl6^*hhHyv8$H={`DT{>J@z{swlme57)z`zB2LZakp0B8sU^p% z`IN7qczE^)W2^qa`RuD=U4p|K+7?A-@XXsjscP1Fww1ZFg?G(j-M*={@nrl2BTXLj zcMVJTNx4ay-qt=K*!0}o&3A3*tSn1s^+m}NAE!8OjZ6&I>FAEUlY5u7)V5LNywMcK zdk-C=E>B2VuxI8J!R6iSx-9R!?*p(F3IWY-e+3+?;i^% zA4_JKz=VyF0YOgR&sn`nEWfsL)r4Ftxvjqvzg8!PnxsSsC%;KCulTa>Z(HhecKN7P z{}^tq{}vFqR6tJuz&WS;dzox_<23ZFi#l~?_1u2Q;_~gPQ+N=E&w56w0%IYyrjH40 z!nj3Z58k-MA0+=J_*B+2R=F~ Date: Mon, 19 Apr 2021 18:28:01 +0000 Subject: [PATCH 091/176] Delete 'mods/ITEMS/mcl_sweet_berry/sweet_berry.png' --- mods/ITEMS/mcl_sweet_berry/sweet_berry.png | Bin 479 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/ITEMS/mcl_sweet_berry/sweet_berry.png diff --git a/mods/ITEMS/mcl_sweet_berry/sweet_berry.png b/mods/ITEMS/mcl_sweet_berry/sweet_berry.png deleted file mode 100644 index 90729328400df2dd8807dacc2967b10eb25b00d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#j=IQC;7-Auq zoFI{LpyM>-QzxhYiA8hY-+LHxoF%x$r`e?Z#ZzO8g2G0_O^GL7IpnNiYfve>Gn03b z#JPVz7?&lwFv;Jq7ijzVknP1)slVG_Y;N>!Fgav$|Nmdk-lC_yOrdSwXP-aV z$duk7a@eHE$jInMQBhNi1YiCCa|}hiIyDJmwy|Fr)`-ioZE#?`ed64?35%zmU2y2w zu?Z*6^Yd*Gc6FDKkFQ|*u5_bBf$Um(1pyh#tZHKNjWbEK}FgvW` yu#lhW#H_@k7bY>nyI9V6D-;GuEI7?CXU7l_F!7DCPt7V&;Cj0HxvX Date: Mon, 19 Apr 2021 18:28:16 +0000 Subject: [PATCH 092/176] Delete 'mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_0.png' --- mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_0.png | Bin 449 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_0.png diff --git a/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_0.png b/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_0.png deleted file mode 100644 index bbf2879dd1c6605be49fd37a27cc2e8841a799ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#jrtRtC7-Auq zoFKuvSg}E!#l)%SU-OcuvL^plAHUgj^Trh8h1^+c)=i?up9_pNtg`>rS3F=-_UNtJ za<$$v+LWjHz@!sx4Lk`29M(S!nxk3ZHkm56R?l~8--Hv9kchtHFK ze0XDf_`m&s36`lxB=^<*KYZZ$;bRAmojbH)eX@3!oCx0u*8ltdr~LT+O_{mhz?`{% zhr;3I`uip7_WnQef!$-XH;2KW Date: Mon, 19 Apr 2021 18:28:33 +0000 Subject: [PATCH 093/176] Delete 'mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_1.png' --- mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_1.png | Bin 782 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_1.png diff --git a/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_1.png b/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_1.png deleted file mode 100644 index 661672caa388ea74d7c965fa90e07d704cc88f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 782 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&Rm5z*OPs;uvBf zSUP#PzlfvE@%@{3Z{NQCcqNBm$QA>UPan7zyQyS|Yz**H<`q-9B`H6(wZ3WU#tWwo zU2{)eV$i0LvE;+V3{9Ngwmkmm?EtvabPcMlu0VS#c*c(=&hXGh_VRslyh${dngz7maB=Q=(>1 z(0t%t_+YT5nIASQWxnXYX?gc6v8-$M^J+s$SDATIyIGa?~rnM36 z?CLAnGu~yiol3c-UHaxlj=PllhZ(DW`EzgC$)d|=`2EFPjuk)V?l5#IHSRAx?U=i< z&BSx#?(NPghu5`pWb=K>O`X;$;N^F8di&+3$L-x2K6fiUmFy4Q{=J@~ysJs#>Z*2` z;yk0!C)>mW&j<&cc00v)Gv}sX(WdMz^Oxy-@|@tHFa2TFx(KapA_BVw|Lkf%`jYjM z?H%{$^Us^SayVpT;3e|t_GbT=r&>=}KbLh* G2~7Y{PfEN1 From ade55cee3358adc5c1c389560393c049ad103423 Mon Sep 17 00:00:00 2001 From: TechDudie Date: Mon, 19 Apr 2021 18:29:57 +0000 Subject: [PATCH 094/176] Delete 'mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_3.png' --- mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_3.png | Bin 855 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_3.png diff --git a/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_3.png b/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_3.png deleted file mode 100644 index f1a0aff1aa0420e3a04bda82c76139227ad4f70a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 855 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&Rm5z;w{l#WBP} zuypci|6oUvWBYf0-?m-1mO*K$z~W_sE0w$gR!#gMz|4Kf>#&>otPMt4K6ieZOGM7t zQJ9)ErNhup=%9qN$;ZZsI432qwHhL`oL)Y*tI9vV^ZJ&|-g#%|SQ_8YKWAyo{O9dckUjManb*TPR|qAW%vJUS~6L3LJ1f5_IN={&Bhl!U#8F8^0ztmiek3KheFoKM&}WvXl6^*hhHyv8$H={`DT{>J@z{swlme57)z`zB2LZakp0B8sU^p% z`IN7qczE^)W2^qa`RuD=U4p|K+7?A-@XXsjscP1Fww1ZFg?G(j-M*={@nrl2BTXLj zcMVJTNx4ay-qt=K*!0}o&3A3*tSn1s^+m}NAE!8OjZ6&I>FAEUlY5u7)V5LNywMcK zdk-C=E>B2VuxI8J!R6iSx-9R!?*p(F3IWY-e+3+?;i^% zA4_JKz=VyF0YOgR&sn`nEWfsL)r4Ftxvjqvzg8!PnxsSsC%;KCulTa>Z(HhecKN7P z{}^tq{}vFqR6tJuz&WS;dzox_<23ZFi#l~?_1u2Q;_~gPQ+N=E&w56w0%IYyrjH40 z!nj3Z58k-MA0+=J_*B+2R=F~ Date: Mon, 19 Apr 2021 18:30:11 +0000 Subject: [PATCH 095/176] Delete 'mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_2.png' --- mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_2.png | Bin 791 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_2.png diff --git a/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_2.png b/mods/ITEMS/mcl_sweet_berry/sweet_berry_bush_2.png deleted file mode 100644 index 61ac69bfe5c10b2c5be607ee0c065ee395b30fd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 791 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&Rm5z|`pJ;uvBf zSQ_k|EgUHFFVCpo=ib^{r|tz|m!t&bS4=Tm8@jtdJ0ws%i`(fS`;L$P9S@ueE^d9X zOj}&EC8R6ksPDzF8oivQZ?D+QI+vnmJoEKl^O+IimIcpc&RO2CJjXce!iBfSSIocq z_nD={KmXjI|D)!?A;E`hZiUX-T_1OXMMOQX@4}ZO7ne1%{Co1Hqd;QzsSDkU+g}^@cD)Bw#U*}^bwzMfDW^Tcf$J-tFUw-5RG9RAKH8ZW+2KzCtL zO!1>|ixc-2W;;JxZdp+|;hp^J^>+^+F+4bXae3sW(&tyc-fAoq&M%zaE%2Y|@HO`J TUY}V7L5b4S)z4*}Q$iB}UtwG= From cea1078a16a09833927b8b1e911106c4bd6a0be3 Mon Sep 17 00:00:00 2001 From: TechDudie Date: Mon, 19 Apr 2021 18:30:44 +0000 Subject: [PATCH 096/176] Upload files to 'mods/ITEMS/mcl_sweet_berry/textures' --- .../mcl_sweet_berry/textures/sweet_berry.png | Bin 0 -> 479 bytes .../textures/sweet_berry_bush_0.png | Bin 0 -> 449 bytes .../textures/sweet_berry_bush_1.png | Bin 0 -> 782 bytes .../textures/sweet_berry_bush_2.png | Bin 0 -> 791 bytes .../textures/sweet_berry_bush_3.png | Bin 0 -> 855 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/ITEMS/mcl_sweet_berry/textures/sweet_berry.png create mode 100644 mods/ITEMS/mcl_sweet_berry/textures/sweet_berry_bush_0.png create mode 100644 mods/ITEMS/mcl_sweet_berry/textures/sweet_berry_bush_1.png create mode 100644 mods/ITEMS/mcl_sweet_berry/textures/sweet_berry_bush_2.png create mode 100644 mods/ITEMS/mcl_sweet_berry/textures/sweet_berry_bush_3.png diff --git a/mods/ITEMS/mcl_sweet_berry/textures/sweet_berry.png b/mods/ITEMS/mcl_sweet_berry/textures/sweet_berry.png new file mode 100644 index 0000000000000000000000000000000000000000..90729328400df2dd8807dacc2967b10eb25b00d2 GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#j=IQC;7-Auq zoFI{LpyM>-QzxhYiA8hY-+LHxoF%x$r`e?Z#ZzO8g2G0_O^GL7IpnNiYfve>Gn03b z#JPVz7?&lwFv;Jq7ijzVknP1)slVG_Y;N>!Fgav$|Nmdk-lC_yOrdSwXP-aV z$duk7a@eHE$jInMQBhNi1YiCCa|}hiIyDJmwy|Fr)`-ioZE#?`ed64?35%zmU2y2w zu?Z*6^Yd*Gc6FDKkFQ|*u5_bBf$Um(1pyh#tZHKNjWbEK}FgvW` yu#lhW#H_@k7bY>nyI9V6D-;GuEI7?CXU7l_F!7DCPt7V&;Cj0HxvXrS3F=-_UNtJ za<$$v+LWjHz@!sx4Lk`29M(S!nxk3ZHkm56R?l~8--Hv9kchtHFK ze0XDf_`m&s36`lxB=^<*KYZZ$;bRAmojbH)eX@3!oCx0u*8ltdr~LT+O_{mhz?`{% zhr;3I`uip7_WnQef!$-XH;2KWUPan7zyQyS|Yz**H<`q-9B`H6(wZ3WU#tWwo zU2{)eV$i0LvE;+V3{9Ngwmkmm?EtvabPcMlu0VS#c*c(=&hXGh_VRslyh${dngz7maB=Q=(>1 z(0t%t_+YT5nIASQWxnXYX?gc6v8-$M^J+s$SDATIyIGa?~rnM36 z?CLAnGu~yiol3c-UHaxlj=PllhZ(DW`EzgC$)d|=`2EFPjuk)V?l5#IHSRAx?U=i< z&BSx#?(NPghu5`pWb=K>O`X;$;N^F8di&+3$L-x2K6fiUmFy4Q{=J@~ysJs#>Z*2` z;yk0!C)>mW&j<&cc00v)Gv}sX(WdMz^Oxy-@|@tHFa2TFx(KapA_BVw|Lkf%`jYjM z?H%{$^Us^SayVpT;3e|t_GbT=r&>=}KbLh* G2~7Y{PfEN1 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_sweet_berry/textures/sweet_berry_bush_2.png b/mods/ITEMS/mcl_sweet_berry/textures/sweet_berry_bush_2.png new file mode 100644 index 0000000000000000000000000000000000000000..61ac69bfe5c10b2c5be607ee0c065ee395b30fd7 GIT binary patch literal 791 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&Rm5z|`pJ;uvBf zSQ_k|EgUHFFVCpo=ib^{r|tz|m!t&bS4=Tm8@jtdJ0ws%i`(fS`;L$P9S@ueE^d9X zOj}&EC8R6ksPDzF8oivQZ?D+QI+vnmJoEKl^O+IimIcpc&RO2CJjXce!iBfSSIocq z_nD={KmXjI|D)!?A;E`hZiUX-T_1OXMMOQX@4}ZO7ne1%{Co1Hqd;QzsSDkU+g}^@cD)Bw#U*}^bwzMfDW^Tcf$J-tFUw-5RG9RAKH8ZW+2KzCtL zO!1>|ixc-2W;;JxZdp+|;hp^J^>+^+F+4bXae3sW(&tyc-fAoq&M%zaE%2Y|@HO`J TUY}V7L5b4S)z4*}Q$iB}UtwG= literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_sweet_berry/textures/sweet_berry_bush_3.png b/mods/ITEMS/mcl_sweet_berry/textures/sweet_berry_bush_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a0aff1aa0420e3a04bda82c76139227ad4f70a GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&Rm5z;w{l#WBP} zuypci|6oUvWBYf0-?m-1mO*K$z~W_sE0w$gR!#gMz|4Kf>#&>otPMt4K6ieZOGM7t zQJ9)ErNhup=%9qN$;ZZsI432qwHhL`oL)Y*tI9vV^ZJ&|-g#%|SQ_8YKWAyo{O9dckUjManb*TPR|qAW%vJUS~6L3LJ1f5_IN={&Bhl!U#8F8^0ztmiek3KheFoKM&}WvXl6^*hhHyv8$H={`DT{>J@z{swlme57)z`zB2LZakp0B8sU^p% z`IN7qczE^)W2^qa`RuD=U4p|K+7?A-@XXsjscP1Fww1ZFg?G(j-M*={@nrl2BTXLj zcMVJTNx4ay-qt=K*!0}o&3A3*tSn1s^+m}NAE!8OjZ6&I>FAEUlY5u7)V5LNywMcK zdk-C=E>B2VuxI8J!R6iSx-9R!?*p(F3IWY-e+3+?;i^% zA4_JKz=VyF0YOgR&sn`nEWfsL)r4Ftxvjqvzg8!PnxsSsC%;KCulTa>Z(HhecKN7P z{}^tq{}vFqR6tJuz&WS;dzox_<23ZFi#l~?_1u2Q;_~gPQ+N=E&w56w0%IYyrjH40 z!nj3Z58k-MA0+=J_*B+2R=F~ Date: Mon, 19 Apr 2021 18:32:47 +0000 Subject: [PATCH 097/176] Update 'mods/ITEMS/mcl_sweet_berry/init.lua' --- mods/ITEMS/mcl_sweet_berry/init.lua | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_sweet_berry/init.lua b/mods/ITEMS/mcl_sweet_berry/init.lua index b943935053..21ef0fd53f 100644 --- a/mods/ITEMS/mcl_sweet_berry/init.lua +++ b/mods/ITEMS/mcl_sweet_berry/init.lua @@ -3,32 +3,46 @@ minetest.register_craftitem("mc_sweet_berry:sweet_berry", { inventory_image = "sweet_berry.png", on_use = minetest.item_eat(2) }) - minetest.register_node("mc_sweet_berry:sweet_berry_bush_0", { drawtype = "plantlike", tiles = {"sweet_berry_bush_0.png"}, damage_per_second = 1, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, drop = "" }) minetest.register_node("mc_sweet_berry:sweet_berry_bush_1", { drawtype = "plantlike", tiles = {"sweet_berry_bush_1.png"}, damage_per_second = 1, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, drop = "" }) minetest.register_node("mc_sweet_berry:sweet_berry_bush_2", { drawtype = "plantlike", tiles = {"sweet_berry_bush_2.png"}, damage_per_second = 2, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, drop = "mc:sweet_berry 2" }) minetest.register_node("mc_sweet_berry:sweet_berry_bush_3", { drawtype = "plantlike", tiles = {"sweet_berry_bush_3.png"}, damage_per_second = 2, + selection_box = { + type = "fixed", + fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, + }, drop = "mc:sweet_berry 3" }) - minetest.register_decoration({ deco_type = "simple", place_on = {"mcl_core:dirt_with_grass"}, From feda530bffe6ee97075a2b906d109358ba186837 Mon Sep 17 00:00:00 2001 From: TechDudie Date: Mon, 19 Apr 2021 18:39:09 +0000 Subject: [PATCH 098/176] Update 'mods/ITEMS/mcl_sweet_berry/init.lua' --- mods/ITEMS/mcl_sweet_berry/init.lua | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_sweet_berry/init.lua b/mods/ITEMS/mcl_sweet_berry/init.lua index 21ef0fd53f..d1967c68c5 100644 --- a/mods/ITEMS/mcl_sweet_berry/init.lua +++ b/mods/ITEMS/mcl_sweet_berry/init.lua @@ -1,9 +1,9 @@ -minetest.register_craftitem("mc_sweet_berry:sweet_berry", { +minetest.register_craftitem("mcl_sweet_berry:sweet_berry", { description = "Sweet Berry", inventory_image = "sweet_berry.png", on_use = minetest.item_eat(2) }) -minetest.register_node("mc_sweet_berry:sweet_berry_bush_0", { +minetest.register_node("mcl_sweet_berry:sweet_berry_bush_0", { drawtype = "plantlike", tiles = {"sweet_berry_bush_0.png"}, damage_per_second = 1, @@ -13,7 +13,7 @@ minetest.register_node("mc_sweet_berry:sweet_berry_bush_0", { }, drop = "" }) -minetest.register_node("mc_sweet_berry:sweet_berry_bush_1", { +minetest.register_node("mcl_sweet_berry:sweet_berry_bush_1", { drawtype = "plantlike", tiles = {"sweet_berry_bush_1.png"}, damage_per_second = 1, @@ -23,7 +23,7 @@ minetest.register_node("mc_sweet_berry:sweet_berry_bush_1", { }, drop = "" }) -minetest.register_node("mc_sweet_berry:sweet_berry_bush_2", { +minetest.register_node("mcl_sweet_berry:sweet_berry_bush_2", { drawtype = "plantlike", tiles = {"sweet_berry_bush_2.png"}, damage_per_second = 2, @@ -33,7 +33,7 @@ minetest.register_node("mc_sweet_berry:sweet_berry_bush_2", { }, drop = "mc:sweet_berry 2" }) -minetest.register_node("mc_sweet_berry:sweet_berry_bush_3", { +minetest.register_node("mcl_sweet_berry:sweet_berry_bush_3", { drawtype = "plantlike", tiles = {"sweet_berry_bush_3.png"}, damage_per_second = 2, @@ -51,30 +51,30 @@ minetest.register_decoration({ biomes = {"Taiga","Forest"}, y_max = mcl_vars.mg_overworld_max, y_min = mcl_vars.mg_overworld_min, - decoration = "mc_sweet_berry:sweet_berry_bush_2" + decoration = "mcl_sweet_berry:sweet_berry_bush_2" }) minetest.register_abm({ - nodenames = {"mc_sweet_berry:sweet_berry_bush_0"}, + nodenames = {"mcl_sweet_berry:sweet_berry_bush_0"}, interval = 10.0, chance = 16, action = function(pos, node, active_object_count, active_object_count_wider) - minetest.set_node(pos, {name = "mc_sweet_berry:sweet_berry_bush_1"}) + minetest.set_node(pos, {name = "mcl_sweet_berry:sweet_berry_bush_1"}) end }) minetest.register_abm({ - nodenames = {"mc_sweet_berry:sweet_berry_bush_1"}, + nodenames = {"mcl_sweet_berry:sweet_berry_bush_1"}, interval = 10.0, chance = 16, action = function(pos, node, active_object_count, active_object_count_wider) - minetest.set_node(pos, {name = "mc_sweet_berry:sweet_berry_bush_2"}) + minetest.set_node(pos, {name = "mcl_sweet_berry:sweet_berry_bush_2"}) end }) minetest.register_abm({ - nodenames = {"mc_sweet_berry:sweet_berry_bush_2"}, + nodenames = {"mcl_sweet_berry:sweet_berry_bush_2"}, interval = 10.0, chance = 16, action = function(pos, node, active_object_count, active_object_count_wider) - minetest.set_node(pos, {name = "mc_sweet_berry:sweet_berry_bush_3"}) + minetest.set_node(pos, {name = "mcl_sweet_berry:sweet_berry_bush_3"}) end }) From 9c3fcae9e13acdce172fe7768e26765312929c8c Mon Sep 17 00:00:00 2001 From: epCode Date: Mon, 19 Apr 2021 13:02:12 -0700 Subject: [PATCH 099/176] Fix many things with player animation and update alex --- .../mcl_armor/models/mcl_armor_character.b3d | Bin 453135 -> 493300 bytes .../models/mcl_armor_character.blend | Bin 1208948 -> 1210268 bytes .../models/mcl_armor_character_female.b3d | Bin 453135 -> 493300 bytes .../models/mcl_armor_character_female.blend | Bin 1210620 -> 1210092 bytes mods/PLAYER/mcl_playerplus/init.lua | 12 ++++++------ 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_armor/models/mcl_armor_character.b3d b/mods/ITEMS/mcl_armor/models/mcl_armor_character.b3d index c8dce36a80df34cae8d810f3454d6e39b059bdcc..95f763eab25205397a85236cb0f610212481e585 100644 GIT binary patch literal 493300 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
Eo&XH{5;ds4fqsH)cS!0t^eq4ob%Nawz)(*MK^ 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 _@%^c`?a1T9`lek~p^tIb>;>O8- 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
}7HxN$Yz@$lV*If*r& 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 C+gEb{ diff --git a/mods/ITEMS/mcl_armor/models/mcl_armor_character.blend b/mods/ITEMS/mcl_armor/models/mcl_armor_character.blend index c2b330c6c960b5cc84ed3a81421383e25787795f..a5626aaccb7fefd5eed3164226a0dc78c9a3f317 100644 GIT binary patch delta 122374 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%0DeQKyGKJ=Sbcm4 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 diff --git a/mods/ITEMS/mcl_armor/models/mcl_armor_character_female.b3d b/mods/ITEMS/mcl_armor/models/mcl_armor_character_female.b3d index 59b867574058fb8df8952ec7fa6b10ff6c84aed6..1b4205344e2ca724be8fa876718a321e7ea83139 100644 GIT binary patch literal 493300 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
  • Uwr+$UEpyD*AF4$f_B3Qb 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

    jf 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 z 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 delta 145468 zcmc${33wD$xAX$NNS^*^jiX$kvMg;{039=*zYAYbb zC?_fiC`epT5Vga|s;KQc;5Jcl!DWoQ=%`Ua{_k4pZn*c(d~@&f#RpHHQ}6HH&U=vz-h};(x*-zGwE=pkNzz9KmN-J_v^@9XcIwQ1H1 zqpaEYmzLQzrRVmlnOIh^dF|L0mNoDG(sTSZrDLIJ?6A#`oO_35%>jzOH4{e{)NGt! zZ{B#`GOMQKya8CSdES7jB-jq{*UO$F#I|o98TTvfMdy=Y1Cl1pJ%lR5w}n^cmOf-CR*~(6Xs2W?}93_V@|s*J_Dd6T16rd*m5s-mE1+v*LTZ?5wkH z)e_L_-raW1h&6p{E?DGjuDXAx)vD@-8xGH3un_;%ocUm0&8P+T=Bjlm=h;|sch*|z zslgi>TFinPbi03X5~h(GYLjN&`Jy$_8F~3tmkbSewyci>c7aKnWh}>9YR#+8>-?v- zUD8@2vHpeb>qAWbs}v%F{@foQwhS3j0N;846D!#$bEi*J9>J}9|@t2cknO*H#rkKJctA(&AZPluynV4kRscL9D z&=8fZoec(>1E*W5=C&lObq3{uk6sU5v(S%x31_w>S)DVqNJ+9amyRMGBdAZLRi&+OpE64zz_GwGJQ<)x+dBGpVhW zo$Y^=8c^Nn`>DHWI>Zf1)5ykM+%r7^DTaCkz&9wXJnrs*-dOB|?uQX-+$9 zUy9Al-D}UH4uVoseWf)tx$b0WYM@bhJ~lbv+s%p09qP_9YqqvL+3Y#rcG8gzP$=6V zY5;i>XTCYcdedWngRsYx*}ID_r2ZjvHJHQf8$I^R=h==;_N948#6dO-zR5cL28Qal1&f!a7QG1iw!JlmI>S(=^Vo3#r zz9-+gn6if&OYfyV&mHJhKx1W$g$@Zfd7Z4mPUzQ_FwjlwWGzME*%@^|XHku6TJbnH zGfI&J9CECc?$C8JKg&wDtDuiHWnHWhHqsiav(>qWcErjCJ5~HUXEY4FkZ~JPY-wi@ zJ9E3$#_YJ;>5~2ni*_YV6Va5S=)NYHZlySM-Aqac(f5o3fqP4jDq7hbA^H~--7W)$ z_W3Zh=Tw;vF++RfPppQfkJ@sE$$YsvVACbpTh^buxlQ){}@XR?R^7wM(gD(U1725F&vHREUcZ$P+8G{25?6sWWSyB*U`BN+ zXi_f-q8qC7`eX#9*=RcM2@V=cx!FMP>Y9yrwX)6REbLJb!BMAC3bDId<4bzAj&UZzWXN1pWhec--z<- zaEgbmK+^n;ET2-YfmQD&IOfJ&tD{3iEc}H(^-$D<()JY%wMBoC8;U?`y8+g4hc2N3 z?UNN1T!C(!Kj5g{jS{IL+C(Fwg|==N^QN>nbT^T+xDmM5cA*J`LWm@)y9wSeh7k0N zfzaKACNfkNSE!Pzw9tJFWvLII1klK&qeGQcp%HW&XhAHwXK^nQg|CZMm`Kh3t}x3b zE~a-rbXviSnL5IFI#LN9=Jn(9-ba}l+(Fg0sZ zp>v^M&7BKnsUNzK*_LC<{Sf_9(rX{<&AOD`U0f<@L0doKp)cpYdM%ZS zVj7F`(HQf3D!d6Z)g>S|gpH--f!M|ploqRLNO}%RWx!qVJl$`FR$+MFQVNqwqULcH z?>cdu9qup$wekj9<*Hg~EQW-o29!(f5F`Jj(7N|Yn!6}AkccEY@>g>VGAr|27i*!} zKGaGW7`lY3*qs&2ASeKpN#+1UmW}bB5xJD1@lA&iO`%s8ywr9dT z0|RtnQpI9khFLK*X;ygta0oGzxze)zIe~D8kycT1a`|s>@g2(VkeW$zMZELbKf$^um6nU3&NOu^ zF}iUMxc-szEyoenTeO^sJ(QCARF`At*(yz(x#6x>RZIc3YmO)S)J%-gU9n zIkhp4y73phbl_rZK?eN0)+WYRwse z-UIMUqE)1OorC#$(~Eo;K?5MKfA#J8dQ*<1gE_6pgVfw|nKd}s-7WWY&!OYM*MrT@ zw*qZ@xCKpI9XEi3fn|d7lr;1L(1%OQtt2Z+*5};Ura;}Ed$~2(8rfKxLiJr&noVpl z;L8E38b1TS(XZ~sXVdl28eXu{>&ECmY z_Qk>>3{d3aR;}e2tdsN(PE`~2S-d8ZgS|U)Oi51_ zeqAIzOUiwcAH`KX#l2S;ZI$$PVR#i2xD}EHnE}?+M6g?}o=;2n+`{7E%6NLhF_C9K`O)W__eVWml) zYNPH4P%b>_AjT;EH1lUdZ8Tv6G@I~eXeU+TOwf{l5-e*SR^qPj5&(uj36@Ch6&m3# z78`uV6FcU55X*TMdmrLiEdDgRzDUTnv5lM3IT$24F!{zV^<*n?4EU4sX8&C4GABYk zK-Xn0&U0Lxk_%OLprX9_rqVh&PaF0VGWCUo{zAwYRCKq0N9!C??6XYQYFLVxQ)Rgh z(U@DRzJp9F=UwgBl>e%SM(?T#QN(sDHrHn>7lR= zv6u3Ct}KbamXba%VRx+5t%M)SotgwV8KO>r7{f4Yi+LO``h+Jgu!2dcIzl}L7by;D zq}sOBx~Hp)Kf!vv1QhhAkZa7E1BrvHOKelW%o-)5RB|;|$OBkQAf=mGR&8ZE!Pyv` z&3X4ARE3vMFg3XNtXP}ZQG$>=1+I9r=O%JN13az_Z+#u4AfWGTN zl~kb>a~P^DkAM!r2V9_V_5h(&q}GXYJOWvg1$BX@Iz(#njMY9vR4g3sxd&egzGg4z0YqVV=Z45!K3_&kqTK)O79SWSGno{VuJYWI`L| zIp3PQVY+#1b>86Q^82B+0WV6iRdqIZ++&p_YWbf`yAJ-2ot5bbTm*&S3yIeEf+=Mq z{W+#!g*Dzs^i3K=Z-9&>&9w zCh@Gq#b83#ALv_bGpRf0#@>9T(a=FEugDE#o2euH7bjI!$n`$ z{4K@Gs4i)Ty+a!Que*8e0jsU~<8QDo*X4L8(e(BEdzmhK;D%w!)zB<6FSJ_Y)ogRs z)mB1O_IcNTj2UyE^{f5ISD+aT9AD82s+oF;WjmtoM3_RO;^5c_8PKj3-2c+A{cEk7 zR8k!-mPk8}RHC-PYm)hLoz*HOQcaaIQaWBY-|G^yAAsI6)VCVq7|2J4!HSN4`=6uM z74n?Fp>asMKH{aMf~5^YNw|q!gN~9)-zAv8PPQr&e0!;*V!To`(FBTvk;ajgO}Xe&E5X9l#HGuqVMyPai&f zPO0!Tz2>y2Y<8$#ZTvVl|F26%oAsZ8L$h-?NYLQws+l~}zc4Cj#5JC)CabG3D9Sd# z0?&YG|3H}h$+Ujd8dK@3d;Q(~6Hzbt%MyM1Vy5BU{6`_+;WyijWi8e=LImI+mQ@vJ zZ+p7`TY{JLv4apbNCDS2NAttq8bMMHeO~W5E#{)-#qHxRC*0RKz-)XBR+IXAmcvt- zBP+iIPCTH9xT zr%w6PVJ>wxqmFm-QQOte{=TL3L%aU4cG6Gm9{ke%*3-U^w*D0x4O;Sh(A}c=dri(Z ztDF1Z8#L&|l9J^=WSPF(trDO-3>)(emwA0t&lmg#Jr~Y+&!x;r= z7nZMT>2CS9FXL|o{0C5WiQuo#{e4ULc)R{R!T+O2NlD+go(m4%DkBcM07jh2NySGR|EzWP6s?c= z`dkI|SpxNm^+t9>efsLGr_b4P^!oe+;sNXaOo@jTfG@tlu7^&Q@V&s2v8H;r^|$1) zLq0Da5NIq}ms?VDwwdxA7?h|Tg1kp(Okc;JdcgC^#7Mex$~$o z?3F^J+$oK6hU1>#89MO+Cwc~z`;wK=neFoIw8c)epY5Fd64)6TB6dPNR| z%iQzokp?A+L0ExoP||DA)eJjYy`5khUbDJaR(70M>{~b^f7S9|w^1DWMr}TXG1Y-5 zhg+BbTIkFCZ41!>L5_KShp)VBurKwsLUh8=*RL<$x%#C+%fB5_g!t#4IIZZJeJ5?t zd+|EzW#8G?w(#zcXBS^z*dLd<=uZa|z?*J!S}dSpJ_Ro6g`098Do*Ql?9K(IY!58Y zdzHF8=ugE_Zgz9<+Gw-M`vjiwV|B9CkL-nN44!&)vnyT)v#ZeTjWg=kqIvXJ)sM_h zVYBPd9Vh;_WggPOUxsx&Dz4FA{7p8DEjJF>uRn9jWcX7}-8xvDNYmV563h4cpL44o*;y@o3>(Ae$a zQt-w(R+OijAwV*gWz@+ z@4H?O+h19e{PyA4yQGbuTMm_lfun8NwD>^xefNH6on;O_VY`X9ftuxq^}f%UIFBBq zpoH8~_c*M_S&m!3ishV_5y_VA0|#Ui&L?~e*oZ0KzYK1dg$taOFhIZa2Hlhe%(V6X zuHMaHyYP1htQ{8ICVqFHb-q3A+n5`>QFo!rsLrN~U;&_R&#k zWXgIcbmK^y_%qxTl2nsd=5L=t+ZRONm0%`Rf-g%J3VmkNYi-XYTvw#ia-|FY$o7%F zCixd@bcPlwNu7`o)XYT^Em9KqpUj1z<{Ko@A|)vo5`vluO+cbWN)q}(e2t{$RV2|O zC5Z?Zf||l#fkcaxq+C2fP_qF^v`9%@ty~h6@f(n6k&*=aaQze1EI|@2Qj$6$A*eZo zBwC~-jbaf&&6MAPM2nOpA^}EF^FESjk&-~Q(H}w0$b;4xjwWh8BMw>PQ(cM9%YhDS zpQCi!A?r$bVz+6g|1u7M2E7DPtE9vk{zoj#lYdwjnW>K@w8hPjuyLPOP$1feo2tWB zqD@P4)Ucj8Z2iSrify%RC$FvQ9DA|j_JHmVTkPKO+m?THz^0WsLSE?j|6+z+=kHKm zlHima=%@|7864{Bfv;1+6yss^Y zeRBhg-MR88U^m+XKYon=?0^%boqU^?*#pgx4j{J%b_wL9$*zE=i+FcH*0r3D`?Uiv zbjZ`B;NAFGdfGYmd8rD~oySeI{f+MUukYw@ok4l1620Ci5Bv#dMqUE@ptVRz8dM8n zRo%zwoS{WZ5)=}Gnir8oi#d&kJTb2sS^@~YPk3kw!x!2%iC$Lbc)N` z#;l2-*_H-2XpxeXZ($OGng>C8h88JFMLm-c)Z}#XgMw0|Bz2NkXtRRH(_n-vgqcvN zbczcKj`*3Cz&b;Vlq4csrU+{0UIrvuq$DBPRYp*ge5^lxjFc!v#Z7F2B2~Yxfz{Yj zJqIeC;xxWUf|(1PZHzeDojy{Dm06}AYlE4=>WEK+(%XjJx+4Xr(rayUB+}+^p-_bD zJC+d2Nu!JFv#hn1k}VX9s8}F%C7e_SS1)Z27YaoLuV;kH(%54}bsLZ&6pCn?&j^*J zT5){rMTAf&qOOV&DofiMBR1idb)is%yO0qoOCy^RWVui%A}Cd?vb3>MNE)(3C=^lK zB%OtD(x7JV($;&SP(;Y$`cPSlU>WVua-mQ}a2ng8veI-r69ztOB@~J%7vHHYihJmn zSjIGbu_4a85y`78Z9&|q^6;gDI7F?yLZh-YO1J@$UsA{U(k$YHeHHQKeoT42_Y=wW5?Jr0lB~RBS4ZX#>hW4qh z^h!yJ6sxkqzvE??$1MuOgS#{;HooxCQ&N#`xHDIH0Ca=w~M|L&X@u^gGIB5eu$Co;ZcKm6AK8O!34W-GO|_Xw!D2KhvZQ^EWvxntXz=aL%8A zg+q#(S5Ni7$r}N|Q|G}-LvEoOtxli`Ch%70Xv0@$knyM=_WNc^5S-wymq?d1=&%W) zmZ+ZR1SwS`+!mpguw}EU@D0v2Oz|N z12V!Fp5dPdtp+uW^Mctk-=FL7yqexTk|@y5+G{N`W#!KM#xiI%XG^P*G?*k>w@0yJ zcLHXjOmkb~MQt;ktaQvrU5~WkJTVJ@Gn!17GSBpOOvAiJ4zbh2yTust z3;Z2yel3XZW4^oy?qlx2`zW*goY zX_1oD$%K)hbVrk+MM~0C!CVMxaxR5?3N2ESe9=XrI#Bu&@?vg!lumJV;ydDJRw8RH zQj$iwO;o7I+P9N_>g|fsDX!^vo;?shlZ^KwTBIbkZMfzL%6Bwcq$KrMud;==wXb|ZPrdI9|l!?X#`<`Zdad#1sWS;FQC#?dm zP?}K+h03UC!w8k7A;FbE_Z>o^i2N2ZqZCeB{Upoe;XGF;6j6S)#Efv#+GDL~W-Jtn zsFzn{RhC*#NHY!QZt<_ml0^WjU5Ef z*Ok30!bI@0b4r2qygJZFYPl!YMx+jn2@tR6gvo73vtqKpNBXrgXV)~9$D&Xg4kq55 zT}pKzigbXh;hZTnXUE@BBOW0k?;<7)b9S7r5H}jbk=l%WBajh(W-5$vHp-nR z_7A$-3oM(dX~K@A1}5wo;bX4D`3FhBS^F5PK$KLagNCa^jnT1CV^C|I+Z4~c9+G*N zq>&8Kx0~u~a(Bb*Q;JpL&~b1XCtmRG68?;;ieOjH6DOQ^t+3LiNYO4b2MBSAo_5g% zoL9h&3Sz>C=HV?C>UOjlSD_lL4xkwUhJiRnBRHnn!gY@5!W&@z)kn0|v^(eB6CkDf zV*907EeQ2Q?LNB!?Z=IGoEpMX)XJ1u z&dUy;`Elc|{%0MY_rN@}eGhej*035(27(0c3vXNmhCVETscDX=*$+ivVDjym6sxMi zzNk#jVl)(gMj7hnaXy5Q@Hb1)P$^P$1epVbxbQ5IZZd+){J+{Hc-M3or4bdLP>lwo zcJWo6dk0Rg>77ZMDc*et%oOj$nPO08H5EED{FFQ2aalayh}_8y!p(+P`J-lvlkbF? zqJq8Y1@(Y5Q-sG131;<60XHK}I4e<;Ea(uJj^-GvMM_c;ka>bYwR80OzVKE;GoeuF z6xSdlIPs%1M#gH9N0P{_6{@WJCE!!x<`vrpp;KJbL>|D2pLrjSFBz*vN)kMdC))~b zW<5AYYo$|Mnygn5KQq$6>`#l7q~Rc+XF*W2x5kDi0#c+T`PZ<51U1`$%UCT^k~DFT zLRG=;R;=wxr?@7WN)bPkQ;XA6DN+&*AA*`qci5dBDl%3Mto0zVSqZqDkc5|x!xf9$ z#H?MDdm-E@XbjEoghCPdli5z?q!meC=h=Z!C}P~zdug+dWc0Y<1SjXw#BHdbmM zCQyKTB_G_QqO`ekJ<{T;P$*)YOb}I+x{49xs<4A!=o^sj}3$ zjG)_w_=&CDR;ettgF~GrYeJ!RL}bFQvOKM@sqw@%Zc1PN5%+ub!bt<1wW6Br3 zw{n%MEJd)d_M+uNp@?#+K$WEku>)^SghCNb-MJT5S?VipTO>m$6rugL%F-HS1lFL9 zJv&cRJ@(R?nTXEh(SBd&1+I((+Gi-=m>_I!xYxk>Es>S}-s!Vto+@c*01szwKBQ4& zrWEU_7d(l^vwLyO#Glb)CL$qEoXmmqVZ~(7YX6?3=^_YIGijy0)}~+86YbyOomYHB zo@ldBnjs)p^Vxm=uajm7aFzm7q$HIdF~U^nI=lj-T4%Fyt$%+yWl43h5thd~Uq24ygq*l_%Ao2QO^c&4}GFv$Dt7;*- z3X||mGxuJ9fq8Y4eWscE2+UOI0^CTX;)-ne#tk@8LDo16KiM+lH~P~HRaI3z_i!=?D})F=Ixl`a>Rm=pp2#8>9-VSgvfW(9Fc5D}(q zw+$<%^?0|1ri6E$>J03Sv3%lp_8Eoh9nV{Rc$8Bwl2@XDEt}asL*MgcM%d!{RcWqiWE(}(RSkU>gN~-EDp^^ z;_!`MU?J*6)Ar=hC_ZS1-#R<=m4ASpeJ5NT__cpQVNk4AFVHj<_^WqxBIOMLIzyx> zN!I|}PA7fi@17Cd%UiTGjhq4UfsZ=|^`Lk!IpxTB9|c##E5AWs;Lj*u1kd6;F$z!k z4t*g->I>oxkPt#mX$yGqs^02!Z|#KqWW+bT%^v{2N|BO8P$S?RL?}I`3b%CvmSvNsbi0HIZl)U( z0$TTLfUq9W6G~7TM!zCu4YjcjrCWqQ?hb;r=0iyTD(p z<*;w5aN-@YFPues@%WvkGZ;VLeYifJsYO1Y$h~tFzS{`o~YQ&>|(Nm4!U!H2-!W(IO>j$a#n6;siC-$VH2k zq)tc(YLeRrU=3V~lq6U#H%d~j6Ndf?U&h`A37z6DLWldYB`gqLFaCp2SlGfqfqROeq=GTT*ptx58v zp&Nm?`EcDKo_Q)Ksv&HG=s-g^0z#oO%BNpPr-`X7t!s82%~gd$5owi-P+3~_j5vU| zKtiF2^84rTk)*;&BY}KxNQO`-B28{cJy{X}j3608p@?yR@LjFSQmv?-XbVKPP$(iI z2MVez^_3v-HcKcJ5$rpHwu`7NjRDrG8fWQ3p@<5}t1PbuF%tNeG!9WGd6lL0LGj8p z7>8((yvowZr+yMyGKKs^R!+%933wssh5#^G+bk< z8G=yV#ofl5MbJg2qy^gM;p^aT=wS*G#kzSiP)iy*pZj6=LhNnvh1}%ei+l{Pd*aV< z3{L4LJ3U2+wDS&5MB89-x2hK#i6$G1U&)Uys z5IN|naFPXil5O6<7a;SG4cyOlB@Ijr@HlgP6IyH!~K42D6YM>SG~wLRc5HKYPlJl z5!eKZ@LyjmN|9Td6`3cB=(EVDyg9x6bJ?6e+w3_mkeDKr-i<>gs!n$)%dVDqP?IzF2@NM zx^j z!6Hw_ezOIzcL+B7lqjswde~aQB2UI1`YT}P2)1Bw6jo?G>|KIIo{UZ23fPMoYjsCs zr>+jP?96l??ry;$KgMNj1KbF~_3)e|gdT8(08ualbG8F;fB<`XKq2&iD+P!Q8CbXj zfazl8k5{#6S6$MLYer~2?7f0To{Sy26R@^m7nenONN7FmD#0R8QFwy{W=2e4LUcv{ zwf8I$4j#un!Vx8jC67Xw=17!|40TVU?;G^FGka+?Cguny5DF9@|fGL~6YoAF~b@U7rLJ#N;U9uUlPYQP7Dr*4yLkK;_2CjSp%uDJGef_=x zQ4)pF1HLanWXM2>NY_+n1@5tq^=uR>5A}hdkXsaLO>aPT_E19Qp*|E8a*IN3Iw5e6 z*|@@XtMjwTy6!^g0ryO%fz(y8S5lw8+FlCFJWzk5&J5UQSau-IM6R-P2CQx#Ihr7n zTtR!>_6j#u=kw!X46^P6ZrI5^?k)9)j_Bye>RcvoDcHyZh~>R%m}BpA30Waqbls9?N~g5=Aw$ zd~O4{cjwvY-fqaH-)mE2{3|Gr%lpCwxpNbru*EZ-?VRj*#|pq>@S!k3#>`;uv(C-QePQ}|Gjs%$nnCHX*1Yv@r)&0xIDG`} zvDdMk}8K7F8F4JDxvjLyRkh*26v{ zSmY`0*aRoz+`2Y!w{-%GKQ~UiKs*-D3JYY-k+y6dOhxCsX+c#!9vA3B?16U+7@0D7 z^#cG-Z$NN-D-mK3{G5Q1DTAB31Qupq1*1Gx!`V_Dm`4AZ`FX8?`{+2kgqz3xdEt&y znY)`ASm-~S`nWFUU=Iw{E9005$Yb(?FhSKyeP>*t3$=%SSl*d0bu-F36p^WUl}&AB_Vp2kWe)WcO8}z?3Lb-Tteuk7+`5 zsohFvv-$p9XkpvqB3xv6GXEwVQ5Tju;$GOkavq4BJP`(y_#hX055GrNZILhI$FBmN z+l~hYb0z_U`0haf9)rEY02wob$*X}u<^Y zT=p@%j=J-1CnGz)qY#wGN?c0Ok0dZg<_P`ASMh&7QAAAnMtC!yO zkLdZ05PRTv1dL3hB(Hc8!B5A5h1dhXD_~^G;H~Q%I6z7!v?*r9I=_oY0?7S?(0lmz z1dn_f|H=c-LjP{)e@+XW?yVLGnFre^Fl5KDee0ct?f(7;ck^#S-;Uk=Tc)re(7fg# zD38ng!UefAm#^!bg{eD)3l0#-1^-gaq@uvdo<4%~IDH_TPy%y0_@J{8&Pte292oAQ zgvvvGC@AE{sHBGhwbV>0i9!jLhr(4Ps81KUF)IBLK)qh_9-bLOW zRXtqP#Zg@>b@3?;=%!C?^f?5r+Cq8E`ZeU~&pf!uX=OHE34_em@<3|#*85`?O+$~$ zrb0<07xAKL=n`+yv_1zGOMzWhwk(=9O+7&=6os8;dOkRg7Ku^s_Uuw=Hn^hDqNS7(V5!v zRl0bBi1<5@00ekMh~x=?Cx1lc^@(yKiEE~B8JEZBRfHFQc(QJ69&=WuC(!m`ur)KZ z>2q+=c{}d96PHhj$%8!3TN#dgoXmO;1l~5EK%{`5$@mX`BWwZi#7$@W*Ojw|o zCzt!^uui(}_ksPOp+|sU;ET?S%f0L3axX6~_wr()mv`g%CC24jqW#eVTgBy*;_}Hc z`DC?FJi>?E1HYI&^x=}X;eA7r=LKb@Xyg@et!XQ;;oSUKfGFhAi$aobO$s#&Y)$Cs zyx$jqhbXF0>q?69r~)6lJUWjqkItjZqx0zU=sa2&oks(s^JrjmzOpr0*j&)shZaWX z(Zc3Do^XwATVn>*A&aEW6Q~(SU&ok=&WnLeUkOKMi-jHovCzwlg)H7xTUVu>ugA>k6OgI+)&wp+m2sLFL zoZab22#P5%as}s!p&2+c@TUDB(!#^Q-RW{oX+x+IU|ATxlx(KX3Y6Io2>@OLV5MPz z>>^k^;>}mpW|+@6^%>MQbfoi||iPpA_`f%$sjwj*&Am_hD|-+d3S zwx*gTa|7u%ZS$blTcsj&OM^Z#)~N(lg!ybPRKSkd34?o~%mgJ3UL{t}gp}rBg$+Hq z0>)tlfCKcaX6R=8!{}HI8HK9D+^NXo{U=~Oe#5-Lda#$nET(FP;<`3f4N^x}%{0yv zSF`ddSn38Y1?IuN{vPJ}s=%p7R5j}34nuxaeS%kQLf0}s)@pA`LMPMZhQQPIkmiS_ z{UjDK<)^mvYg&f{+Vk0VvA<>KSS5oqI3Gb_=GBD|Kc&hq!|gBp25_1s2Ru=V+l8() zB{v0nrwExh%SLj3^15e1pq1(Ih%?YkUf~Qg={E-^*mRZV)`)}8mDm~P@tXs0JIr=T zC~$GQXr-pRSeM{ha)Bx9l(4`oy9N9SM>X4tYr$*y^y$ayy!IKZeQD@KUkj)z{*CPk zO8%r)CA$N~DooLeYn|G;>)`1IyqMpMC(CpNpLILm&Vbf#Ub{7Lx*6X&p|$CDpM8?q z^Qn_&c6M_L1G=aBN!Oq8YGktL&GpfP-+WgeL1T`Zy8jIl=E>k+c zRXS`Kh2h@3HZRb@j9&sb17_9SsbIgq5uY0cB zdi|;zI`i&=OFw#Y{KU%Q#rtmChSx9qJ*Rkb?zy|3y#7jP##P0L{~9oV6n_ZkCHtyA z240^7{x5*Rd8>09*`X9JR~DZUdbMa=+f$3~xoP?iP-4g9 zaBSfG?5nrA>uZWYiK0<&b$+VXSNSFTKDn(Blqmf3+G)j;hGjhS{gx|+fD%K-cN$xi zG9$Nm{M%1Ix#j)^eSIHqEjYKsr%(4edt;H4a$LX7XWsVgML$12$!|0o!eZ&$7^K`Zzl=nH@UsYm`TgW4a(B9r%Z!uO_RS)eLActTR~A7^yf zQ9R_s?Z@Qp+3tT}<`CA>=i9n($|<*3CYAWUDJd*$J${$T?V6Bg?CL;{jU8C?wmJjb z>Sl#o-yXQohWk$X^cL=|duTcAtuy$hQa zDMUAdl_Lw@MyKy5C8i5orKy!XVa>UCvX&MpNkmAP9i7jmMM}~nBn0L2xwJ@0vP6G^ z^4siMq$D9BA*dOIhiGY$lBhQbYNi2+Lq&X)lu~PL3~ABP+k}U=Ta6+>_dcb`DTE{fI}O=F zp@<5H5h{zc0j)x4FYnIqp=JYQ^rS9dbgUGRCDbLS?D1 z7(sRjg(B+Y)i9Ms`fD5Don>){9cgP&S@|)6Nc+UFz3}@V%3j^W4yD(Wr7?LE$1|Z( zfnfbpM2tdkolL@)c?;4{l3_>ENCl5+!8tfkH18LdVjcQI*TZEwR)~HBQ@ut|$P+8? zSfMJ*W|pvn{CGrrYTiB+zCZ*0KmQ%BynX25!-LGTYXZH^*His&c;Y~3q-CRieEQG{ z<$>0w>Y;#ZzVGSJDvXHD>I3RnfVp-wYCCxi)e=`r`-?t@s7HD!dm|*NJC7BORH`@V zj3p^mgZXOIF+^NITbPj)Pa%T6^2n19A#%9$qpjVleoO>_nyM~UAs!vmvDH@S6zKEy z33cY`O#iXzVG&G;J4c@BS@|&(wtm+0A;AI%vPV=Xjo!2_AWGhO!L~asoP#kdQzllS9J4<$(`svPM{6^5m zp^j~mhB-|cO0Muwh+)JwJn1?($0Z;TZ+16Zz)>x_42J*Oa11!U4c%8ZZA_5 zO3NxPn4P}$>y>8H6Y~aaKf(8CVRf4qi_jSl53PCTjSl`Hh2t`x`SSNwJAYYUJ*4}? zzGr?hU4|TM4xQ&8Zg%bpB>gJ_!{6-+tg`~ko|$3Zo9CQmV?glfGX_qdNerhy7f7<5 z2!B);$LkAUgz>r-$Lm@dm&Z-w4dL~YHeSa0$XVQ_xMOj=rj3iuXV55Ehq(xKT5)d{ zQz6un5;e+EY6Rw?TZ@#WHiNrh=0^w7XpxdcgoL1c5RDcoNrh|*C#ae7GHip_A|)x8 z_k|UT^+JCM?|UO~CKM>0;?!Hj&%6(;9V+7ST&bBA{6AqlO!xVqP8`qG$2xvAT*$sw zdi5A-WoT3r3Pl7jiLEX54(mhXxlkygLh>q0EoKD0!W)OElf24Ot=OHk<2?@HUdmdj zEUi|SL30M7P_6PMud+0t*z!Dl*D?-KD|wZrzUFA!bQDBLB3WfAf+MFL?&1~-)v8|d zDl4|Or{PQ{4xz0@WhsK~*o*tV5h2Hp2v`;2$l;CO(%N(|3yqE)&|_*1+LYEiHxxQ| zWZ2&VJQC-u;+?j@!Vh`xOGbW|loko`6RXBI#VN*x-(GDfYo;;$qsBP4v06*kl*WGbh*})eUO*ZL#>fu?1?hVZ@}6i( zgSDdaD%8ibSxQxF_ioXaMtV3t4fD~4-y>WQ7k+X-8ZJf3BD9i8h*fyXCrBbiN)kjJ zfNKPy;U1r1?Xy}q<|1+U{eNH~>TV7^XZLs9JI0{E#=z*_PKZCXz6@3{h8|;|Yu$yT zQkuS=B*%>fXL8R{{suqZil7rgX0RVDb;OTK3f9iL0-43$Pr4aY2pp8CK_n6wN2T=i zxL2RbFPGkp*wLV*MaraBNQfB^N?N2OjdJ`KLHWFAEmD$(D_M|2by)Dhprpe{CKM{2 z;#@gVf%utiDR$?vTBIc9LZVP*J)}jK*zr#26qhxHRU&>SCly$0k&=uP5*5+R`V2q* z#^uaRNR>`;`SOZC@iQxtwH7H!t&k`bxX@pwKX#N>I>j{!j`*464!~NAl%!5i=oQjt z)>p=8t#pcOkiaBR0anDO-tesP4ifWCrcuk5qoi{ z6$+J+RVi8tCyjZr178&r3Pm*DzzCJ42#Py{Lv6NDD5CyGMtHJBD@M?8E)Y@M&lcI(x9ZWh&R~LLh^*gVB|B6W=?_|QXG1Tl3WaK=L!>85`ei}D z1lh(xl&7M~UOOx%;;E<%u{vD~o)bG2)mVy&ThOe6hDVx;cF(YTr02_QP17|nApo+_ zT1cCxqEf1JipYI`V-`SqnZS^D5yneQ)yLVe#6(PKDu#$~PFEY|9Vj_^ zDmth@Oi|M!hiYjyp|c7d9W|6=J3cxCFS8fyiO=qCch3k7V*@n}KES%Vb*P&+HIq`c zfUia!gvZo$S^$#rL3nrfwDBN3lpx1ftE#Gc@Gz^cwG$JA;329|NV&yt=xxI>%<>g! zO(PGo!l8#%VLk~?idAE}93Fduy%r8HLrQWp5`|NYo-WA)PmeeeJnfz;p(JT=11s)6ri#;%AyTS()79|%C!*d=NKQto z@XB0J+#$XOjyU-g*MHzBl>T;Rp=zp{hw@l+wJ4_30taiXP_r?<1m1cn_yp&P6W@ivQ@kSc^GWu5>2ghJU6cY?Vn?)L zIJX#%FJbBA1B8Uv4T3hJI(|iU7lw~VR{0CnWOV^ewt=O(Mtd*qjq_y=MSYaXDFPQ< zB`cJYM#5sic1WphunVMEbq{U9%d|o{u^4nt$9%LOo)$KUGjQy4T6jZ=z0gXRa^>T0 zV>;p&hNGY1=0%E>B!Zd%>mWk;6pGcuY&eC2G^8b5M6k0U8()7x{h20;<=fc+eX_R%p;?)SNXH_Dw^&TJ)c2s zuvg)=T`5*`f_OPxScbvQlz0z@MBzhcVIvLh=NqW+&4DYdj`W40jPk$p$Fp?yi8FQF zL`UWHc`Nh%75)y@~m-*{G&G$u0r#SVI@@vL5KOD@2 zLZuTN9*2=QQkf~}h$o7olujDbZeoWiy(%l-rs*qFC?Y6`#%K>f6_C2}!IfA$@s{Ku^OzGNWn*ngJhW2bT@Zhp%=94qK9Zwsy$caIqanF%5(5T zCHNb7>NP?_-bIY}L=it!LM(A2(q15>W)(bAEa|%2WDayv%)Uu>_vim_)5L5^gD7i(t_4F_RAArpCr=?Gq(OJ^SE39$oE!CJu zXDL>dL$BfG=Fzz)=0TQT5ANZ-vg0Zl_&+>8RFraYUuP~P4Y>0kJU;Xl9_{g=k}Ev& z2E&Q1JU-Mir6D_kHDS%U3+jP%{?W2F${^hB^Z14O+UU6B(U;J6_*~Q=WIJ@}1>+js0_>ZKL&9^Sx{?&qo z+gIIM)UWuKy8hv^{Uwth`MjiL^>M`q%j%0d-=4Yolk@uI%wAT$?fCK+3&$L6DEh6} z>6`Q3S+r};pdU)jC#k!BgXfBcfl%q=cYL+0+Y9YVPq0^)!2YE0;gH?QPtOZGFS5_F zF#vGp@=o~l#Ww8hiQG^G1u%FoweG)l2>Fi=Yp7JU8Pf8 zt>8$4nRc$-(QK@-?Xg;}bP=Ibyz=+?p2od~-U6)BDK1MYk@(S(#2H$oB;$mHpr#bg z4bIRaB?$=$LCq{6Dbyk*X%rHLs)F6ESOtkrc18(AN&6){4Lcy3pQLKw>DU~MJE&O0 zh-;-97a-#fDz1~fa?*Nt(VM(18i#O~aL}tPjUcWcnlT84YLzc}l|{TExEYa$<9{5Y zT=FVQwJImAXpRwwsFl3RQp*`ZbBs7dMDi+&v;nOcL7!uYLo`WVWl>`U1lKt&K*k}) z-NwFBS?ViB(4v}9sITfJud;&DWGQI)qaAUGw52RVWvO==L5qVzp)!J!S6ONYw*ZQg zI7EfyRhDYS2zq)Rhp3ah%F>_@VMKFW#UUCbud>KT;9W+PVeG~sYNfkXS)`4JpgNB` z4LKrtm8HIFB(12<;}F`Vd$P2bB?Q*FjR=`n3Yb&|MVRfHTqmVKMg*N|xhL@mp$%ID zBPIxu1C0yT-F9|%{5fVbWxge8@b5D1co#=$IxnoE-v|e1CgtzLYf5;IS?5%x(m8

    15>v|$j?^)>n|G_M)`9pHBwyaD`mgX_T`G^Y#Axdl7yyRNahvDb!bh zn5h}iooMuDf}dsZJn;DjZ-M1^#=aH&3xg|BKHb=?fNrJHe+~YP!M}q4rc-4=0*tvk3ad#%3${&jz!v`x={1q5I6}r$Be0(O(e7th&$$ zpM;F2LU)+a{{{MYO=Zrh0Y={wyqCe9!MhmD`SOslPeI3t$&5aZ&(;1kAK%pK4OL%% z@okANeyT3fF}(|9Tm3DVz0De^@)15iCIrSClQA3{cJfuA=OIEhCXM?=8(HaH31!C+2e8|W>-zF)gM(PaYX zaJexl1-J3Hz~p`7o|BAooPFe69b|Av@SXkPSYm$NUC7Y~u=vo_xfR?unCt2kQ)eY~ zcN@J2oel3>=)O1luFx|FY_9^GbBXvSeBMk5JQuoijs7(7)1z{z!i5Jyp((hL75w3M zp`Wpk`tMNNIJs!%7<1-fyuno=Jr~gTeiZ2{Y6JWah#_!y`jbDu4(hXEeU7P#B@@}^ z7eRg6FN7dkb8(L`CX>NA$*JdF_Gdz1uG;gAo{Pk`#J%q>n!si?KA$icn`orOAAScm ziN8Yij!|=c9%tOV0iAWvt@2@G!+r2ogZ}_--4~%A=Q^9>GAc2cduV%uSE2MVn!twh z`dK|E42WC<;aY#=?Z`Lx&}%`oc?F-gEl$~WR72kb{(dS@ z+w6Y8`x}!NVDh5B1w)eN3cA>+xucIXxS1v(djCB>IU|X=gWCndUEGfN4Jch^Y>tQi z1mkBTbX@VQidm~9)r2p+e^&8z;-6B;8oljagEs=CV;v8>F7#)B2vM;IGk_vM}pg+H=*=BW5bJs z?R_nDTzB-t3lY~QF)t>c6Y?&W7l8%}z*vYu&n|~%iP0B8&$UULW5MkNT?CD_;YH>v z5N!^D&7sEr8ECBk<-oVm1U6i9X}b$t0Kv`!E|4dU5pNW@3Rr;`4V!9SO#W%~-1x2i zoxofXwC7^9*?J9{KN>wR8YZ~3TngDERyYv+AcL_iBF~u$yyf6Bpbf7?TxP`F39LOY z6V{$rG%jh{L}9~qK>QItHxmN$3eY5nUkJQk;qqevuU&mi1zrw#-$Fg_OK$L2uEZ?} zuOvTG3pKZW-l`CDX*Ll8^HR0ZUyt3h4{td*i>T&p1J?)fdVId%Z^i{P&5e4JQFAlr zod->Ljphs|=0$}QjhGuaw@qS>`PYQNyeM$;5>Er?Bqip>g{y;@oAa4Q&q??%Ju%~+ z9ZDMnH-FAvR#=QrPDbJwY&aQ-xt(vtpU*XW^{>=IU4!CFjS2Z>29u`^CZ`?kyWw-O z!Hd8zH+Tv70)tt8g+Koxr0Oa_7P0CT;JXq67vqy<#2N5w489Kh27_+|zscZRz;89! z2fx=2 z=vCm?jD8qO|7h^*;AvK}QQJrvB_pJsQA?!249Et-aa?9>t_SCM(w;hwKQYIhWyD$V zHw-R;#te5lvJuL+O##Q6QLzGbe>RxW|J7jX{$wyY>(jmzpKlrbE;xHl{X5`82!ZK? zWyG7n-?tCv-iPovQ$YTq!Q?b#g)#WtZ16|m|1kJt@DB`T`9BT*1pHHjKLe*7{jhvr zLf}!H|16~NIrzT}ZUz6+;IF{HHuxLxFAUxS{++=;f`4!DzrlYn_*?Lw45ok9VOzAJ zU$j3!9NNls#73y!3jQC1e*yo^;AlJC2!VKJkAa^^2>U|dgy;uEI)HaFcxUh;gK5*n z;I8e^KA#4#G7tDY4DJ=eeSrBefHwWXO9Yohb_XA1^m~H$HJEkzz<~Bc!C8la(q?a? z9}d2g;Pik<0l-L8FdBS};F1WRBG8bI#)9u}^z6wvqaP1mY%rf(O%z-rPZ}p1Js*Sc zsS|@>z=s(9Vc=8JMmQY&P=om-$>PDlM;SdIeH=wU2xuFIg2O|61U{J!Vg`Av;F8F6 za6XNq{seG4lqUjrHv07ODCScq8qEUda}-AUE1aKf^n3uwGV0I5=Nv-VPk`s7MoMG&{ zfuCvc9Pnud&jq(OQ-JMrxN}1`efZpMzNx@8TSrF%b9@-YOnjb72+Su^)}Gn1^M+23 zG4>aNA7tz=2EI^mNrZY13H@+B$#b|gQd$AkB^Yvq z=i&2wLimvffX2QH_}Rv05;!wSn@jL{DIxF#=+dK20msqK{9S+#5u*XJo~@&H(Ax)k zN2A<6hwBUd`5*?w3CkfNW=1$9#CwBVo1wt$9D+#8CUJ@}Ivji&^{BvydlL=56!;Pl z^$Wlk8cd!J>1#r`+FN!_;lx~TpZW3& zynFi7hP3bN-|=u_Lh(FR(fFgjcxg(LhAj^##zc#MES)hPw;|APxK!IVC-3^AF#HC7b0Qo z4_ciVid!@)?N81?ooGdRzI1h>|IV)R;nj)dJBLFA_78s~(Z93p7abG(`#hG|)gSg) zqGQATPb40V4LW!ic2YZ|Slep&iopk1+VyPYe%b0o@14UT!(2M;X+0#etszmd^C7$B zQVi^Ocp_2apY=o{x%0*@EYTlesq7a&k?6kjurG5h1N-P)NvB*w&?+<5zdg&C`axPj zyP#vEVZYTSH-5kkXRJva(=I*Y^OwrcfA^U2oN2`OH6JgSoeg7abH~tU0{b_1eJ&55 zF#a&9OB;)4zx7&Rb z4m%2C8+3jHxj^aD+6VsANP9R%;Y@@Z3kMM%f^e#L*nk<<|0%ffw#RJ1;&2awNa2V$ zYy;fz@8=Wubx1Gi)@j^1pLLbNycziNc{;GSeEV4Wq7a^IY{K@mvHGxm*w3X?b{{w7 zr_03u#lY(h87lbIZ!aX)#{LAs8qNIm^Rc4`cw*G<)+fqGhH&Y&T}4luAqLat!-V>o znfTY(%_027ka>Zh&kg?Jpr-PU*A|NY+k?_g<fVo2zfcO&!!8F2K%td^LPzcZ-ggsf532;95cpkJA zl!ROjPMd|`9l);yZwB!}2c0hf=E-{rhzH%PKs@YT0crv*2JxiM=PUf-gA$(B_vSt9 zfe_w=z^I3UMu1*{JO!N5js-FLoj?q(48)*1ff)S$AU;{)X`D}2_JhnIaaoD<12M?{ zAojW=h(WM!chF88e?~*&eL#1^0Z++yfEdjE;C;Y%0qq9r4C)Ko9n=%F3g!L4yMX$G zia-NEd@#b(GarDIK)x5eH~2%~eBi-{B0LMa`dIZEH zIIi#VZ6rQD;mMng?G56C4W5qg1o1Hd9|Q4$#b3ZDgYO064GNF*Jc}~8gLsBr0WcoQ z4dCOzZv*FW+ymlCnrUJs21zIEHJ=ys05J$=V=#!lV^)|g2FYyg31SdDne)lXL}1z; z0Aks2jz7~g62!+bJo7IHF__yyJW=!M2an`@0#X4xKB)Kw#2_YsE(Kl#x(xIzC=GfJ zR0HBOqz6E(^B{;1M)*LBS-B6ik;W@Qbbc3z&l5P2_?&=g!_>kdx5T7ah z9`qV$J&4a0xTHP-v6rLZ;3@ErK^sAQP{H1{fjEJG2GQq#Ku?3d1Tiar2Qe#rit-HC z|KA|^pzlD-K;MFH264Qu1u^{%psztp^G6`A>90WCBR&LiVr~O*0{;qPmiWYk!EXh< z2bzioxwH=hai#qZG@9doFaVt%4$gUS1ZX&jhZ&}eM>_WUNXRYVhk~;gM}c#`@F57Z zaR`VjCJvcdNq}=WJAiX#6oNC`eCopVr$GCnefcuS`zVN_fZ1pV&R(?#-vrJrj+@Le zAZ|v-g18AC2jXUPG>9|062uiW9mJ(}JZL=V1Q65T34XYuWEcrp zE|rrYb2#{*f%Ab+Ntk{tjU#eGVD2FcZSS)!ZRdS4xhGg9`W%|DQG_I zCV-ki7eKzB>%S799*PRkOki%qSAe)_%mGaSodY@$v=YRx(%cI^5p*#y&zjEx^Jxj6 zGfW5Zp$L!cGeFp6CW0UDv(4ZNfs^4|x5r`4|1kvf!DCY!Y7C7;E>?hHN z&Iz4fjE{j(ECFZl8^AfymV-Fa7$7Iw0uY}WoD1TFI~&9mFqSgtS>Qq7qd*LLA!M$k z{egEk#7>O?9Ra!nWmsWp`GyjE!-o^o4DrDO$BDyo0!SJK=M0|(;tXE};H1#uI)9Gn-L9}8;nK{G)ovU|N?z%_Y36r4B}ATFINLEOa-f;<9r zH{_AvgF)OAW`VfbOawm}#9+ADbO-0I$9civIZwDb?FZfybT0hN0xbfa!t~w+;zU^i z&WUp-=rqtJpwmIOgE;Z(K%h6xZUEw9b^x6U zIskMl%1;5m5L5)>+TIy-Fo-ss`P>`!2F-)*MIdfQ*K+*1={!Ou_@m$#fM~>}b{{zB z#c9Co&D9`QUJDum-2@Ql!6XpJcPaGD3VY2?Jpf|XxP-Y`vDZxhL(ns;2c+?_KWG?; zONkSSQIwabxdFKm$SCOll0>2p)lMH5ixP6X0B`mx4G?9tTZ?o>{E`U2n=b ztejuzQ}DsH`V0jSd%rIVxk?bMXv-DDiO1}m z1>yu`w#Iyj|l`91YH;IRgAP@WtTVHD3U6cRK(wm-ZBJF3GFG?*xAtv;uTCOqqrbH$7Y=Y-k{dJyy~Xcg#S=pO?= z5}Xrz8;BGAk08zq-Y=#(o=X8ZamImjBK-&S6sQ_<1Nb6v&W}>?r@{XPY6S5%?KyDX zwml1e2srnW0&uPnAG`_tF7S2Whl6uTcLZ++Kc4r0F9IA31=Dsf_GSje0Y6T#mAzXJSqaQb=^6z4m{w*jIk zcnf?c_(t#*;G8Hwg5CxF24dPPp#Lj4Z^c`{yMi;=UBKT1KOcM(_=DgdfcFCb5PUCi zPTVuW{|5dj_($OF(f}U=bO!$iIHTGOx)t&#;NOEj1APnn6ogx5nIBhyw?by!FAQ;5 z9*6#O@QcB}1gFh6AlCgF^f2^XVGF_OGu;n>jSK_-4xB-30X+cu2k;Ky{|5KKe*$NE znUy;sw}I~i&iS%G_|M>MgcI>;$iIN^3(ko*3Y=MFXMP1WK#p+yQvmHjM}yjdeh=bs za9m^Hdx8o!{O4q_RD*$MnKP$$rRpw1kB z_M!^}L?h#PAUM~4EvOj8@#+Rnr@MmsgE;ONf#{q;a-5l^p5RA-dVuZ#aqnPn86+n< zm-tjrAJB48KaPJnh?~$spaCGJnT@Om9|%sTgFp;|S>OcQ9h@tGOOinj1~H4AXq=$T z+8;neKyBX8NrNyN(3Ve*Ax!@d6PN>n~obhGg zr-L~D$AI<&vG-#^TshnYPXvtzF&K81+2&q@6_=JJbw32|W~)J5tDLzLz?qH7pqoI< z&JCagL7bpdz}YzG&vl?fLChvMp=OjH49*ET75qxj;h-we??CmS!$3c9|L1s}3OWjO z9_UEWBcN#@uJNP68O(8@1)yU=*MrzwF11SV3qU7;P6izhx(CFpatSl-b3iQPUUL#S z=Ml5=A=;NshmA3ab3mtnI6-ECxNC7(&M;I1&UAD9PXlq2VXuaQ*a+vrS)h-gKNI{h z5QmNP=v>g{AhyBbJ{y#N2p{u6^Fil>t^qL%97pOl!x4M81avWoz2(d=1YHQ?p0S{v zQZ@Kxh8BX?fG!0Q^G4?q5N)Vi1cDCNf1|WcScw&=XQjm;ma!7cE(h5%+lXzH&S}qj zY=Cu^fUHm2QKp`@@(z&>mx3}NR=OH=1?Uqm=nulP9lq|Lzqh{7T1Owp8Pa%dHWdS<$sD@($25whW`}X z?@oTq!3TcJ{XqZAFB4wETYRqkt&x;pv}?P){UKi^W<=kq9p0;8<`3PHHU5@@XqQfz zy=x2EapC@i#T|ObMndCnIV4)_|N2#;Z-JKd|2i?aQ);*x3-|l{96iv#>+8gQy+8VK z!1xIM%kJwNHjLZw$k+f zuBLI1O(KZYf#m)leu_@%x(MBkz*#dne|lbVWrg3bUAsN}+X|B1{fE9zB>l=*vZG&p zNPHK6;TO?P{-AFXeR_M5mLM4HP7=&p8-|R(efje8{9r!#F44c(G|jCO|03B@434QO z&|VVyy$g~lf5EzFl7kRgq;a%gG`_EYXF>8^{cp+59TEjYSQ{O&-ZJ~DY&*!>{0X_f zV@sl9^7}g<+{^?bUU2>pAHP0_v3))N+>?}l*_Li1w=!&-BK>eDS@m6_w|~HQ39k=| zM$#nw6IAnOeV4d>sEy1l!IBqRvGYG>ORl zr@l|@^S=ZZ{ULG35EF-u%iB-mvhmVCe?oD6@Pmn~XxXtNSa#d;<>M8%G!xsnhM5d% z%(&1quA_fUw2rf_1g%ccR&7@3l|RxdvXkB4WQ*Lt{^#hV-tWl}R#aH$kqB{FGipWr zvL6$>`+dGkbn=t`PW0?^X8!>^J2*cWM*N)VPxyD@j+i)J|4m|GPn&>oCZzGoC!BY- zU-U+FT=Y!;#I{69QC0r|qga32wzLdFm0#PI_@ZmZRI@!xvAWK0>4dj*%U83>*CON#Sn{-zjClZ5*gj%BiCQ1?)` z$>a04j5~fw^dDk6Ydf#I7Ooj4DS4fjKz@Hfa`M>l?3^>Yu;Re#*O~|K-m_xj)8~z! z_|Dzsk>X$195H@H`FXFN(^PisnDXwYoiXmgwxR2G{r#Hc;N4L=R;=KiROV-@k_?< z;y(!U&UQoIgbjJqhE>jnJR_d$SCBd40bG<9$CK$>XC^x*c!TVHevO^9i*DMLm##yi z-TYKxa$NC{-^*XWU{m~Qxu}?yheQYY&4tM!1zL0UsnI!|>ggnn8(VRHx32Flf>6L~==i!j%JfjgSf(6UhZJM&d^wPcDnL)DG_* zyHMi9#Ut*GUV*>h?U#Sq?#SKyeYfwVecBx}(Ho|5dp|9g_%qAykxR9==zMg(wnK7l zv9aK_pY40!!P1{~TJmAPW2a>2PF_lvROV1l_u4tpDgHU9Ctoc#Y90YuEqk!6hC`yg zZoR)<1!!_@Ma*9{B%X*pa}R!>?ds0SgZzq}lV`^mfxmKXa*V&vOR<99tcPq_Khg|j zY1XejEmrLJ>72aLI5{)K-*kjl)N|g{H17P{r<@*{-bk}g|SEZE5tUB zPu^2dC2&@kM)Hcd%p6_g(1!%AMHO{oP4FLwX>0X zhr^ELz5IK-CTn9)vD=$_q1%ggO~wjR-+su9&xxK|pvgxH_BYz$^O6I5vwA2I*&|ez zW;DF1y^=})hHlBLVo$TX6LwD?Tv#%xN*!O1EC?z(56()*0bZMqOqnM&4)cdR;* z=+w!OKFFN(Zv92p$?(C}$@+D0Vk%iD+2c%}=v}#E@>}#ED>1&-xeoQ6nBr{!| zNJQ%7%YN3$;{M4)3%o5HK6tsuz@i?>l0LSc^^-b5{YX&iXTt#Nr|2~Vvvm)wE^(6* zIQ=qo$<(r5yc5-ncvmm023ju|^+OA)q;4(8T#zKj)UsZ(C#e^SNxfXRhxO8b5WHk^ z!6=l}m}=HdW~NCE-K(3qrPfV!Pq?Yq5IEF=G&81}b(1O^8vCqsrm_@ddXbRSOUGf>%gSN!;{6%3%#-ln>BmpMn>Np$LN?iib*Xc^pP#T`d|vT?WATu^XL z!H?ePM+RPSFi*@YP-cDFHd6Dn4GCS_m^#+>eDhee(JF1o&YQItpZ$$ia%ntRkKTDE zmyBLL4%r_b?KKAT<5v!>Y>^75eS$60RI_gE^+N(wH<)Hgf46biz{OW>9il7E`BJ#j zPY#Lk+T-IQR~(~Pt^G^64Wf2DDyFnz9hRM-mF3C71#+?Si$=$L)mC)&KdC?sx%|!_ z7N6p;n~;1g#;cw`e`2yYCKq}+c1~?gt{9!VSi5bxSEF+F66HD|xH4ysmT~v~I-fft zu6G@V9n$z>kFl3e!s9D{**@{JOR1P~i#%qXparZw0|xpt?2so>o_w)(ct8Kf0qqho zwjG4Mbh7OzuIQ6G(HUNHOsL9bN@3A~$-!N1m_gbZu3m=c9tb}&b&E#CCv{>#J;u(O zlo3DNgA)Sn9PZ{nUV~7izNDTBFf%FzPqMJLj5MA`jy!Zyy?BzvKmw^J8v`cDJK!mzV2M?^)LWE?Inl3C-S8 z2BDexV(*LO5e7nGNEP6E%UpDLvTtG}zTD$gjKm*gklUr$9m%2?MLuYnl<*1*3m1|6 zS%oR!sw!%aq zEu?o<-DBN5RU`-XP4_zZ&~4pDPTJO~=YVY;cj_q7%qwPpI_xzd-C?hRP03xlFG3F% z`NO}AZ}ls_jKA9HunGDQ*gH~=GAAd~epSZ~ofCX3QTk=>EOT-GS>|WG5w`vFYI0|p znaQCssfeS@+>T%AX{CzXpVkv68A0=V;w1C6mZiR7nVe)iqp~L%Es~Rr!lKio#W5QB za*$ydeo<+BS@gZy;UmMx7k}>TWTN+P8m9N{?Xt8|JhEU43)iEIu?X(yY00C@bDc5^ zbkp+Y-Gt`!)Y1v37NfSCMQWklEdJZ6r3$AOIWO_la_d4IT38LCSU1uNR~OxHcWCL1 zLyLs5_!I29(xQ82*(Dh-$mX^;g*>#xq)W10v$MJzt(}WwN_IYa#&pyv_ihVut}7f< z&c-pt+Syn$=QAUEOgYEykGW$?tKA&URb_ZL+-$H)sJp2PRTkG~gWTcK#QQC{0a7TJ zTT|NxZoGx+MuJi| z&H<%f+{l4T5zk7dmi3ZNs}~7Mz2uH3vr3Setkjjea6!`t!i%Y8y<`@v7l}!| z{%8{;CoXZKi7~aTm(&vVA~C5K=Xm06%gr8vk{DCXy78_siJ^OS;~Y;)rS9Taai1he z?t4uw>m_@odXb>iOWx@O_r2fliRGu~St3b{sb#%nGU`QQQZMfDq+l2qG0&ocG&81} zb(6YA-AGXC#yOv4;>OKA1qzq%jbSp?tQ+q-bt6%!8|QqI6*n^2f@+4ti>YP3WUn`w zp?CG-98X$pF!#m;$sy9zvR*RF)QiNVUUJ8iEt@c93fUtWBte=OQ_Ffu)v6bXNxkGw zCmY{~mt!|+dhbc32(f3`(@77UPE2*{&bwLNNpR{ecRIm+9!_53k1Kq#areKSPOMMc zM)nqMLqgX!rrv~IR~~U}z6mR?{y4@g6HAb!&(yMBGPj!aF=F)+I+5JMbt`pcV^qk~ zKp$Jr`mxsviAw!AM-tp{V|%P*NSk@G5CmUCV!X`wxJ(zv7>rg9ok)0;sn>dZ?52>% zq8P7B!L7Y}BDoDG61lX_zdhNzx4F`L_R4QAX?j_WjzQaUtFr#~o#*c+s_ zh50u~T5)D_Zbu?avaD!|I^YIL5FYi;=~VTd7JA>ao#-ja-o-{^Z;-TP_$kSyF|m;+ zy;4nYkQj#EAbsH6AmyI#{-B|HZOSv|CdpeIJl{1I!A;Un^qPCVo4p<5!~2N4I8OFX z3HJ>~Z|6?tP8s(9!vo&nR>^!0WBl2r{oKPrVl6p*tsQXETt!n-S}s(+(c+md;>I z`hZumFAsQCi@T_jK2krFiOjv)uC$}^{SQxg)ia;=3DV8c)V9&3?pJRn%Kvg3RiIw5 zSr~t~i5lF;*0=t=di5t!2GQm2qNc`9Vt?gPrY8_LQ6+tBHR~q(pt=$F>c+W?S|Mp; z=LE_AXDV4InTJiL7?V12Zlda?uI!@fMV`)@YSvBa5p^RmshiME)FrrnNL{%+TQ389 zn@ZM+_n117nAC}L59O`QB}O3b6_6NH&-%$eu6`sa^^?1cl83ydQdzEvf+RDhmi3Z( zLcNH0_2S$`rE<|I)Y)U|SwE?#Ols&~{W!N#S@9z`3mOfdLYi9E%m1tGTHvFou6{N< zyF0rxvpXRPNysJy2$FY#p%Ud4Si!WS2E~fh2UKlot2R7TsMZ8QU945`!Npcfu(i_G zYOvNp1QYN2#|-Xw}% z@$M&CtdfotWGrtI6)BVQ60dC=$0O@FUdAj+KOL>YL@|{}0Q|qEQ4&-t(I4YVNI6%M z@{$*)QB|abzvPtz&^U2-#UAW`0zyLeKQ6q9_H)RLIaM1$(lm%Dd@&mrQW8auA%xCR zvdyUGaVQ+GILTku;sAtidEu)}#O3lCld7aA%1N4y;gI#YlPY}8i(?;u%}e9G_nKFK z8bqN9x;u_TWHtRp2uuZVRY4R2;ijJpes7IC0n&8|8C2>S_vf>$66d?kxD z!dJ4d`dQBlOj!>V)i88n)Zup#+fTbXZ^ue~J@)LKi2+pam> zaD$a$R~r&=wUU4vtbkXpM@8Mp$e0@&YP*AqEVrlx`0^sX0ZZ>f>Em064A1M0)!FXg zO53%{BW|EdcePn^$PMni(XN@og1# zg>Jasa%00yH(DBTLr3XupaDL0@TmdB;XyZ86LIxA(+$@|U45kG>gASe4}lsLT5euG z*ba8B8a<}Hu-bNmR=^Dm4!Y5};fC|UnhLlEoFINGz_KBLH#FpihKF6f3NR6`!g9ky z!NS4tTDrh+^9sOwgABl|n`IZ8y`dQJ=LOwxq3%YZre-|s1`C32ARl~H2zdB`>mcYu zzK{)c6g~#{(+qWn!TX^Ckjsy_NNbT`*Q(K#b9~TR#vrg`5XZNNnQk7~W0Yabg` zaz~UFxVZs;>#EVk^ECLkpgiWzHYs3<_6a9PMThUxefMOkrfL?duiP!KgcCpFc$!%GUlQ2-hac3PlJ zf?`7;s5xAKmIhq|I%23e;F=@DuH8W2kyM*OP3xW1SnZY<*aT!jG)0S`_N5r*(5leS zbhK_n#5EwYBg1sps)H674*x>$u^Ty%5e^1>8-|znex-Uinp@Ir6zFbDAeqqr5Ge|6 zXV+P7w8n7FDlqqG=oi&t*Qy1YBaO8E@C^r|)enpJMk6{lP&1lS5RbVQbiODCb2W5q z=w#7qxULmo&EQo0jE0W@GlK!GGZG5Axjr8N#hcCYNUsgi6dejomGC(VXbIE+bR$Gt zHlT1Q*c%Q)NWu3s2&5N=I%8FkE=KW>1*tAp1JyYSssa`e5L6Grq76_ct2e5l#vN5t zLqJ$ntRBQrYxHP{^=e=q2_O&)2o?d4$C@BcMulCo4*EHKkd8GP=;UEBBWAYNH;;CQ zloY!b|1N7-W1t|=Y1ISDNZ`hH8v$8&sO}oj@J1DUAQKv+bTxEkmJ?_0bIbAsJD1$mnD}0mJtF85YC` zyY7Z>;yT$+Ok;Td1s5(^v|w&S$Hm{yxnN=AN#D8nf&?q|`AVI+`Nk%{RrU7I_&n{5 zke^;Fe1kPj*5k}>&#m)6@!(>%Hey_C&VQd?c_i^)nhzCj#9!2eIR?HB)1f+a%_bYL z;GUS~8pd)B=XPk@vH1(X_nnIuo_pTBxeMl=x9EZe=ZF&eCE_s8!tNV!gEQqanS{f7hSRdYM^dqLBp>r-%0=9tJeDWcn#Z% z@!cFu-Lus2B1>Put4ROyD)whok*=|d@WW}y&8UvIU>!#XjIXd8N{rdQy{dgO40+6& zcTPFEy6t56m(4FXP7ECWKECqXT5c?~lEMJ`mmBa(iUF!#5w|2u)k&O%MA?}~1B$#QS(1W< z(Abm6B5z3+axIukqU_jaKkL+=zAUBd0I)v*Q?UM z&aN@WSukHmmeI!;aT8y&0caBcb{2ig5dpktO{1&4! zQ$ljK2_!uToPeN5P+}`cR0@oL2p#%AIi{4CsYr_J_BTR`M|*fhGAg-NJRUT`sid!A`>*Dfy3s zCmxJ^eG!+JJ|$t=HdNOF-b&GQ0~f$Z3+KEW?Z^bgSPlB)({>z4|cB8B|-J8cly(huv7bkR1l3fK|v5}yu8wx08rMOO}L&MI%x;5Fc zM_qN>1o2%TC5hrgXf}1j3~c=e!fa_inZ0+-=bAnLtgh7(8iSyXps5!MC}p;|PNqTQ zhQ_+CU#10^bP1UKbBT@rE+%a1g&ElT<-%-fKKC|Y+dJ2$rSfK0pM+pok5Cz%PGBf| z#dR_Z=5=YAw3%%|%vThq>SGy@`W3=VX|88xA0LsiqU!*2p2GCHl)zASitFS+%s-}g z(|Yz9U}!nF|`^&BCtj1$+%G`P{f0^`zOJ!8k2 zz~y1f5Oc^DvlLKLHfLYv( z8vy38f>Avp14Z`Op5IS{+;#;m^i{R2zXn1?!& zgiReH16vOWyQTfg?t($kY>+eMUjq;|Y}I66ez+f-(MzW^YZExiW^tVyh}(2?7FLU5!1b2RrC=kEgpNZ?3Zy-?r^eJQvrv*Gftqj0?-5;zh! zDRG6q6x?5A!v%L1X#c=CqPa~5nm(9YDXryb8yisBnkd>)Cz3~R(l$uH%TLSC97Y5{LU{3t&87a+cdYX@?qWS8Q4sjyy};aPtZ z%I`w?!z6zMDMDHCoSh@-(QmM#4y;3O4}7p6i^;v~hjw2Rk=9^qi3&GPPs>TIOyP+!cD z*2_h0q&5AR)AJtn#kHNdI%pk;>;0I>pf+s&)Ic%o*zXTiK{l46$`Ao14N4Le=3MQ0 zgc`jbp!939K_!K#gwlr!t0W{rtt*G6;s1kBTM?=)E0h$KP)PwLRdA~g-3L~^h)^?r z1yISXP*PMv>0Lu;#wt~CDDu_I2(=fWLd7{n*z#=EDqo4`Dj_M6lHyuwNO9F4q^m-0 z*^s29MADZEn48DJhYX0!eB}l1(`9`SDA`rT2lKk{l=_B}hq$ zq+cU!l8CZ)94W5{kovPCNlA&66i8A7w~3O=TWHiegwm5)lZz0QQ2MpPCn zal3Ge_X$GH-waUwS)rt;gh~o1sUpR!s=v|>#4UiO|0t`wgsjBUw+XW(rsuACe?u(p zuB=#6R$?Uuma@;oT7TGcS5_=3tFUl22{xm|BrJ;4Bc8hkK;bgDBrQbo^%}4cB~2Rl z^TDxEo``;3Ot zW_1sa>{j$WXB?a8W|KcPYuO8r8q-VeR2WkdlHT-DB5@}>w8N-p&t7TWR3x$Clx&5w z>7$d`2Rn?$(sm^VXJspT(?_QXh?3Kl3>=!R=uIEZB6;W8$6xfKif{Lkw-c-Tj5@Zn(9*oB zcfG6Z-o4~Ku-n&X)G~X5rKO-8NI^NkQ4TJ&i`kx)(J{`>XN^(0?A(`(Le_D%sX6v8 zqtX}P>wkv5X^dq(b7BDvm-et#o1$V_ zXky}5Ywq1h>MEw0t%>o!K6(q5z|rf9#(=>4tZ$cD!zRwOZYmk~>!bPi!VnXZhL}i< zV_QEo>dV`eEJlUI#Hdg>rKc-F3=9usmH-LPrkkv5m|39RdfF(9DjU*YQy@3q%mTUW*9LgK#ArXi+72}h?&4< zykL~Fox@F=UH_>u-Rb@$cG&0ae^>Z>x`z$UmDuQ9!bazM*x+1=jm{O=T`kri-6Sw zO~qMMvz4WwjCAiBZ`OwK2L*LpFh{ys_hI8rCtPN}oXd4H(EXb8#&GirIHP@c^kjDB znfA1J`$Od-=JqBez558K*~*ArQ~r8l&-3EAJ@AyI(NLt7rx?V}iR_$8yN#9mV{PmJ zP|n0E^Y>m)2|CeQbGR=+tMwS#oJTf`1$fwAttX0x7h(2Xr-p?~+1w>aQ_#f0fd3P3u-VgP(c-NRg@%9p&y#ot%A zFb%2VBL_&_d9lUZ}Pa`z3qj!&WutYM}(tyC7lN|Y&*-g(EhNVDEW(OMRL&AiE3ImbNgEAggd>C-+w zt*f}cIDO`)JqC$E3{Bvdr|lEA8ni9RG3_XJ2gg_=@+%zA_2g4-!P~@si%utR2r*e&4K%Pn#Z4 zcXL`pir&;5RvZy^H>cH9^rq&h;)tocIjwn$-qf5=97U}6QJ6{gb=g`NzboJiSSK$t z$A&BLK>*jLvZW=~8O5`X9kYdO&FP*jX^gJb3(Y##9kiww$-5X>l7_%y?gF!(HBE%M z>Z}E3GB-YUXxBX)sXifT95Iom#7lA2^}-WPoNH`C(im4r^HKA{OUzruq~Y*orXJD& zppI3HgINuS!Vyy{z@#Z@33EJ87Y8flm*y~lE!9CVTz~%Y)OwP>M@m1kEsG|OphraX?DsQ zyV`3?zFydC%6nu}#&211|7O{glE$V)8WTlb@!!5}2#$&=@0RXbhurJNO`5{GuQux{ z&V8(X3h<8S7#)hnEQ0rO+EWv}eab)P+#O*}4bUEqZ(Y5D&zV}w%%Jo4<>tiP5}31! zLAoC2uS8=UjQ1vn6bWmeC=!u3HX&(@1f;!4h=Vn_{|5f1z#NU!m|>7sPZM9a@9bS2 zMy5?4eKoOY=<5+Nl{4Te&6|IJ&V$BfOMfIPeQKhrb;i#*&S?p_FP<1$;fWy*IKp6h z)*u=lLUA&_h4l=z8`zb@%xO;hbr`e{9Ch(#9<)G>r)i$&83I#K?C8G-Zzg3xgh6wS%OJa(%1o!Rvl0lUI~EDwzCE~oUuM3Y3yD|duev} z&;N!~2>2VDkTiBKq|-as-JFd&7tx|~-K{#;P4U8$zd4$-os^I?KB^N3gPp46 z1$*&b80^}A}wTd0?=!j#ev>FSc-Ca5cjxu=_|KYh7;+&OOq~y4ORfR>V!MIPb=n?&q!E zJz3J!5r_plLXo_klT$H8(l8dWwd-M8(E}hU936@Sx`YE9g?@VIy73-*=#t_%L`WK< zm|?N=m*1Ed2k80d-1~rgzv94zC%N(Y=ec{K_#Jf%AAeLaJpPdM`|1`pzA8R)z*)P& zyepSs3TLN30L~)n4n@8BfO&MvoD4@b+V;XWJO}Sl`_8rkjXU{9mQ>H4^lo=4cO$$w z6*PFf6=~Kn946uI8?8X8;_99(xzO313&#Dpyo-ek(LKse<>*ixn0|-@$9*UA zp!t_v9pCoRz1HPvxKrpZ+KTCeOTn8yXZSr<`%}YgltlBEu;}41&wrxOr(3T;uJ!-`+pw#wQ z@%ptQUBZv+2^!mj?c8QIlq4q0d+>X&iiVb8&uxR4#;9NYC}c>Qae+h~g?X_j)Gem}*zEW|jMG{!j;H{@RP4s)NT z_X6+XjmDDq6%YE<<3B+B&eR>|Wx}1$JS*K<_?)E9er|v}`F1G`@4WT+&@XmEp*!pG zq5n62R`HHGhd=o{@Z{g%cY0>q^L$RnG_%_mpgmHs4bv=V-*^?Cya_~XefqaSXj4=s zh}i4&Z-ek%P|6Z|PS>D@~nC7RiPFl)*mPc#KXzvDdH z75&n0`iZ6yWoXUJClhzJ{g`X)dP>o6obWW#q!H$jPXlZd{R~=8*AAub$c7!aHd!b(7bOY*c#1h6qkq0W=?e%TNUPK8uyGo;phl@V#DJ z16HfHUQU*rvx3&gk)i0kQ}^u=-r1sPa30cRYemfqk0i>w3ityVxNzt#V~Iu=KK0j= z`3s5sc+1wr+Q;R~l5L68KJH}SUu2Dj+3@NeVB`8l*6~B9UH^FE;<>K~-)vVjdJygl zec-?adxTNoz(YSQ;`+dWgRdRU^_8Iq4~rj=;~wPiLcoLk{l_Ref8sbxbEfB8_oe!= zpjf(V=iaF2M?rxLn}zorE1=OvB5>X@?1MThqT#MJ2cF$eG~nBohZAiL7xYp%54O@qJuV0s8Hw*-wZd-jP6! ztl~qflE>T=M_Fkxx3V^?uiytf>tsQS!!X?V?mf?AdvGNlzU^>k)W8J< zI{&9)9Mb5vP}1l?q`jVd@7C{$=zJ<6Y3#W`Q*@I5wm*8K@*k>j%;T)LQX|ZqB%PBM zVH&$#6{LABBg_Ic+tcRY7skU*u^KFu1cD6Si`Vl@54tHB8xXvEPR6cJTS!-(ZH>|9 zz+S{J21a`r8G+%B#4iFC&}btgU^TMtZSd8^e%M^-%)iij!cbKeHR@2Q4r&=>SDqlN zpONaCE`-jCI};g%-f;HQCDtGfw=8}!)ShbwqT&w5FNR8O!?!<5W39Yd75H+VZx6)L zaiO#7L-Rhrv!7Y;M(pt4zB-Bbg{g^x$Ic}BjqOttqo$wF6Qc9lZB}I}UwaB)yT`}u zUdYC6Keb*-!JM7KJ3EE9sSncUyxXlmM_BKtMp4vDUNAQWb^T|9jM>fn$bijpHpV zHkVS%vZc=(r#Le=T6Q4*&Cw6?gp)Hh@uy=>B^n!c_wJV<$-%3BXZ;pzSdXtgg|FS? z!-jn=g>7~U+iZ``fi~U8o3s4kM9!0^igzYyGpEF*Km8cS9?(vSIHKK5BMJNzdqUEf zh>@n$8N$*3eR~A!ecCG2ay}{t(_!FxaEDc=dnQ2(${Jz|${JR)`7c;^>+jxrAaSuX z3IYTdJQTijAfc+<^+Af@2c94_*&koTCfieFr8HUmq`gP+`5-*dOBx^Ok!J9OUCeq0 zMQ!FKP?$vxNT5A9`qO4duMx%WUEV!+y=oN&;%~lci}st6sNH@64OlPLCK4NG->f{C zNE~zdt-^y-6^*To_o>3HH2{kt7Vm{_=^>t!f_Sor$mRrLm4pY`o&w2f?!$P?jKrYN z>crIe)Wj3_oG#2eE%Ewyr%mK9iVgx8tJ-I^r6@ilMe(c@#a*E^#j{fsbD9)8pYBTu zu}5F!<9iNFktB^718Ht2PLVEu?=xX%pQ16u@IG-BV2CXkfA?md1-B(WdGhLq*_=H_ zlbm6$ft4iA8y{FZLMb(QTh#=zN=i-oN>ghBktyAYkx8vmQ5dZr8h_XGAUq69558OY zUWy0X9Nt`J#el0jfp3@|+V<6{T_RL1s zgW`YBzZyaUmsdgPPUpC-p)_2IQx6x0H(}!&+c{0RPJbxsrNU_`Q+Y{aoFYx^lnPts z59#F**q3Ph=Ht|XxI-uFm z!e~thf{toy$J1&HVKzObNe-wc!OW?AIutXfgvAJxG)9~D3tRYCjB(PlW1md&jU6tRPMV@y*9U$-+lj_tWQ8qn~71-`JZ z^_FN0oJT&@GHqBSD!!GSn7BlKD_bTOiHej>i$saWSI6UN^(U?n{kn73ZP9O}+PU+W zQDJA=yh&qo?v@3=xI5EMe!PQcC!XBE?X>5{T63KjejRPih4=9lck!f(UxaZQ%|Tjy z5q67n;J48-VNu1y^2JStF-?nN!pgLC17jX-#rG`1LmwPi%=@wyKR>ukd`mVZA!$^P zv{HYQ)4DCa;TAt9>z!ePzEc*Y*$~jA39TBQ5#bzq9kkiCZ`TtK6+ z-1;#zJf0Ep-@?@bbgl#=U_2$_zX!}umH^=9ymtJ#C2?p3_Tb|%eLbT&*PU)dd^D8D z@^s~v|1e)s#-NiY*wRt4My^VnCGlmbq5~;XREZ-dz6@3ToC>T}_;5Zr5Rah1O!RWf zviN_IgZd`K{vSE0n7wggtTZDLQA`h;9&6QF!3OHv406y5&dQTw=lhvm{sj_IaB5;i zk7KZkqv0#yQ$D)sI-2%5{WD_U`wufy#hh412G!|&3NZW_<}QjwG&~tYWu`9e-_1$i z{Z{M?y zNgB`DV55H;8>8W29RC$u>fh@gcBb2;VeBEJJEvQ9minU^;xV*!=pRI zT{^pi-^G(S#9e+A2k_R0yATFX*>J298)AwdvjIir?5AVwa&0*ju`OflGo10G?D3X3 zN5d<}6EYkq2T^`RhF64#Utm#D$hqgM_7y>K1_m*l*bdlux`lI5yS>i{(D4>*{ye)$ z!?P;HT{^6S-<<<5am8JJ_5|?OhI`=9o;EyI!r8jWeiYVaQ=i*)m0ii6`GH+Q$3!@L z7u%2dG~7GSsATsQP=cpEIEQ|aUh>;Zp#%?caCTjaaCC|T7uvEIittbd$M-`lqEi{L zs6KY;QtaMnijHS32nITA0U4TCFSTKEiH9eMB04<*i(2R)1jkxt@5>F)NeFE83cFpS zGYz(04^HpC#=br`KqnjUB08ghie6iRMRZaD7ENUbZnT5pop92fj;9Yez=WuH{D3Mq zG(1hf$-CdaLU;ruN3(lZ*@FT}JRSgxF82lKd;pZ9vM}qs*^X$q>0gx7u76%W@m9M4 zckw%?-)b-P2WT5V%e%)uiv96MyO14(udnjv_+h8tK421k-DESau}^U>yv>gL1GHT~ zn}m-0@KYsbI1P8$Lty70?h(%>k;LuxsS>9+?{(W{el3eYcs&@UI(r$O)J=6K+J@z;K0owD9Ma`_W#|~(?hh6w5NeWl}&OTnl4e7$+ z@@68C#NFl6*SPDJ0q>-61;kK4?iY8~{oZbdAj1vg?9fBdxaE#*Xt@8|sduo5Hh`<5 zNT3Zjbc-_D(T!#88t%=O61X`V@17W*hp~!#t({#DV{_AHYc^wxJvNZUjnm>b?VQHj z_3XG_I}*@wE3_!1z0g?J5Op#9$#mS{jHWmGSkD#U5vm#RRI>H2S_P~O>JVtdt;=W< zFm+w}IZQfkN)}8j7k>^@KW;Y`Ox-^KCftyVCVA>Y;gvA`<$H+(+wGqRXfHADekfv( zZMW+Jd~5J0SVUWcdC>#?P?V&tzHjzJ5pDHVQuP{b+3+vSz=1);_OZvPhAn5Rp*o&}TfTmQ8pLL?nw8(eVg5&?2GanYMJwDSHM* zB#RVD3K0pVjtRv>4cXZ{QHx-aB08Rdgj%GiIRB7NievAih-8r>bW9P5NGN$u9i8OG zez*&@2vjA4XWO6_abF&TrQ_K}%zEBFzfN#S2|5D>l}HJB$`PKH!|p%{JZJ+rqy!z8 zff7=eJQW8|Rblo2Gf;v~X+Wz4k~~d?4(4E6Py%=Fr|J;bN|!vc0}pFpC%rIGg0`Wf z4k4+IcfcL`Y&S~aChk-n;+nSm!+o{S9yg=2i(VWkA>&Z$Qd`Y&&-b;Ty=Xh1y_okw G_x}PxmBPjV diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index f7c4305095..43f6364987 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -242,7 +242,7 @@ minetest.register_globalstep(function(dtime) if elytra.active then -- set head pitch and yaw when flying - player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+90-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) + player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) -- sets eye height, and nametag color accordingly player:set_properties({collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) -- control body bone when flying @@ -250,18 +250,18 @@ minetest.register_globalstep(function(dtime) elseif parent then local parent_yaw = degrees(parent:get_yaw()) player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) - player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch, -limit_vel_yaw(yaw, parent_yaw) + parent_yaw, 0)) + player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch, -limit_vel_yaw(yaw, parent_yaw) + parent_yaw, 0)) player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0,0,0)) elseif control.sneak then -- controls head pitch when sneaking - player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+36,0,0)) + player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, player_vel_yaw - yaw)) -- sets eye height, and nametag color accordingly player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 0, g = 225 }}) -- sneaking body conrols - player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0,0,0)) + player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0, -player_vel_yaw + yaw, 0)) elseif get_item_group(mcl_playerinfo[name].node_head, "water") ~= 0 and is_sprinting(name) == true then -- set head pitch and yaw when swimming - player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+90-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) + player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) -- sets eye height, and nametag color accordingly player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,0.8,0.312}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) -- control body bone when swimming @@ -270,7 +270,7 @@ minetest.register_globalstep(function(dtime) -- sets eye height, and nametag color accordingly player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) - player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, 0)) + player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, 0)) player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0, -player_vel_yaw + yaw, 0)) end From c7d91baadf60910c93689779564fa3b867cdd6f2 Mon Sep 17 00:00:00 2001 From: epCode Date: Mon, 19 Apr 2021 14:29:12 -0700 Subject: [PATCH 100/176] rid some mobs of bouncing animation --- mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d | Bin 54146 -> 50977 bytes mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d | Bin 75074 -> 71850 bytes .../mobs_mc/models/mobs_mc_creeper.b3d | Bin 44319 -> 139359 bytes .../mobs_mc/models/mobs_mc_mooshroom.b3d | Bin 54175 -> 71850 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d index 9ab4fc10ccbda15e9210e2702e858b35a1d76ff6..1a6ecbbe82a74536be40bd5a427822847acd00f0 100644 GIT binary patch literal 50977 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 literal 54146 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 bLehWdeBH6GwauP_;>vq{d9HGOx!?XDEjuxb diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d index 2f13ba9c465a28ec5b289e0ae3cb02730ace6023..c009839191e272db590eb0e08be0c90356b4acf6 100644 GIT binary patch literal 71850 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 a-zaL${u@QD*?*&`g?*!153p}kwf`5<-Z2;e literal 75074 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 RwK41)rPcK_*f*xy{{jnz_mltt diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d index 54341579c7a4b4b9e9cde54d30469dad7c312f4d..e04ffc7b07334a928c0494deca10668e3c46db65 100644 GIT binary patch literal 139359 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 diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_mooshroom.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_mooshroom.b3d index 725268ea9838cc579f732c857b0b31eb72b80fb7..c009839191e272db590eb0e08be0c90356b4acf6 100644 GIT binary patch literal 71850 zcmeI52bdK_y7v!JkRUlL2N)Po;yHqV&h(IT&Y$Ac?%iE=uUEeJ-~I17XWH(e>fXKI=RQ02JTN#N znl=qK-%=)rFNe?P>)5Gzi{SvHxMGr3ZYz!Q+O$5X&{U;&;Gy zEOcnmt#ye~KHq%_J-c@A_EizjSq64$L+W7KU{CS^$4@1s87y<~j&Qpu|$c_Y$( zFJ&R`UNZ7lReC*Tq?xzG%)`E`C2z2~FY-c0=Dca<$z++mD$kkcwy#?qxYbqW^TlWQk~1H3=Zw7A z=OXW3a^~`^W6peTR(YB057)zIUJvIrayyT0KTbD_6nH)5SpRA%KHm{@U*t7Q-WZ>k zw4Hh1EG;X#{m_|t*f%aO8M;{B4YRz=`_S5mWMo? zn{^(@3mIN{C@+3rw>ogEE7VKud~qH=$1&q`eJ-EtH|sf8_t@82FV?=9>mJw0=X#CY z>Y&8X^b`1u0vXpbWFQac`*22{-zdPm)*08*%EP&}%g76vx>#PwtkcZ@ogEE1X;Gd~qH=$1&qrd@i5sH!_zO ztAp6NS^GNb&%C~F$LCfD$NqXTIrZVPDP1m?mFw0WZEw;g$xD;GldrAZ&^)QbGdA_8~dBe@T%=;p5 zU^4P>%+B&~ZqD*zd9d|-NtyRWo^`&lI&ln; z+^l^w*ZpMkm@{7^Gtb;Na~=46^2`{x$N!M=teVe^fqUqW8F}WjVCKc1RVxqo?k922 zuiQgMEH5PYuKCQw?Tb9Wv8U0=WPFCz9$5D-@-jaQAyem;=iGN2%d^@X-1mM1d9k($ zc_Gg{lo!7*>cv?HZgrLUd~qH=$1&q`eJ-DCwqbE~kA0o>V(p91z_D0$Z@qurj?b+Q z)?aELg^l@soc)YE*k*BgN$Z&RRh<2dJnS2nmz+7zvY#{WYuV3Nf1GZ9hPAI{cOoxV zo|%{Im51Yt-}f5JvyS;B>NE*?v2!!?lD+a`=WFfjRtIi%mHB)<&%@{PxxUQhS)ZG^ zUd%jS=K8bjXSd^XtAj)7?Tw|q+ohcPtC8aKos_oyUNZ7t{%m#1$&9>|;;* zzh`+T%wryCmWMo?TQno@Ub0sn%8TFEtq$Dk3iT2@-~IBrJ|E64cFZ^ypYP|Nn_|{; ztnRU|vtF!yGuJ(?kll_(NlZix>ujqQge z=9idHVgaVHU07lvi3KG-!ZfyvNh~T6T`a|!#m*e)lrti&=B%QKDb z$0R-~v4X^kOk=yU#7YwV601l=8r#(*R+X3_F_CF(KQ6I`#Oe~CU>e)CCDxKyQ(_&a zu^o_DPhwq(L8h_YKw^D~PfC1>X>2!^*hpeSiBB_)ZCr3%q-P}JVL=+(O(iywm?E*6 zM5M9ZQeq2<%_X*C8ry9pwvpIcVmqd>-BDr(iR~qJVjA0BC3cb6Sz2c( zxK!d2iOZSB_DYE>B)%ze71P*WD{+m))e_e+jqSH2ZjiWM;zp*iy+z_?iJK&Dm54O9 zcSzhWaht@qna1``iSJ5$N8&D~vAtK~9*Mgp?qeF;VTlJM?w1&08rz2?9+dc=#KTNu z`>4eCB_5IZ0n^w%A@R7xV-llGWBatkQxZ=~JR=clY@e5SPU2aK7nsKOWr>$0UX*x+ zX>4DUcvWJ$#Oq9B`}Nc>3RhY~+#8rw}ew&_q%h)~`9JH9D8nQO|$ zFguyk7gm3=@Rwaus(ko`oJYvGe}B3e|B}1DAu(D#^}AqV>UWW*ojSHSnb#~q{)CJi z=4QyqN#-JRlX*yMmyq!g)A`8!v85kLDnQ|k+sP>WL>fz z86bn?lVp9e0r?c!kZeRYCZ8ssA(O~t(jZgFCS+5x8QGj{LAE4Yk*&!#WLvTw*`Dk` zb|gEIoyjg_SF#(~o$NvOBzuv)$v$LXvLE>@`5f7w96$~v2a$uxA>>dpl}satk;BOm zY zhc&bXG_(aZw1qUZg*CK~XlRRQXp3rSi)mKIEAI9Q5&5) ztajSOabqXf9-W#t+1K}Khv?1z?NheoN;Ba0*>UK}+(C&ExQK|E-NRTP9A29UcqJm> zb%%gg83JBY2zUh{;PrxlR|f)K3kYcP5zw3?ps7YcGmL;H76HvC0-8nyG1U%LVcw`aqI3nOtL%?H%fJX$uZ~nFV@UV&776G>;0&X`1 z+)4 z>`C?_dy{?0zGOf0S@JouKRJLLXwvFK#O7e8hmb?bR5FbmMh+)OkR!=avWB&}wk>+W2oy6!6gE+%C_l792EiPqM63THFBofNm70<8RJnI?4?pIjwU765VzuDpD|^Eu z<(b$Z&qhTTt$n-$2JQ)@yaD$g38Ilqh6F88TIy8~ShCq}NyGyJ7I%ayXw9{0Ty z*xKxg$fwdappB^Pp+(vE8*dKG|FUl6u(UbXrR}NWqP35APJz{dFN!sc+>y3yzqDxy zS!mOf7X`XrHX_BOjjS$hWz{US;j%LV=km9TtdX{NnzX^yve0fUIX-YUM~4X7bhPb> zE?S%y;xn%e4CHLxCGxerE7r?9qq>XMKDXj`dj@{G&@Hl0-a*ynT~s3rt@C+u zHMoa^2Mrk&^A30KC~ahWhfgn%am!EgS}_70n{9-5NP$mV1VvL)Gy zY)!Ty+mh|b_GAaLBiV`UOm-o=lHJJeWDl|@*^BH=_96R{{m5s@=g9u#0CJ$okTHlH zOb#K3lBr}GIgA`mjvz;pqsYr$InAUsBL$l;GW`N-iUplW&qM$d%+O zay6Ol9aqrMdA-(+lt7Og;qSn;Ecmxh2a^(L(J=<#WA4lJ!z$brSkqZY+F4KWuZMEsSrGM z=~~#frt)Q>-CUqjP&~x2ZKdVULYq4wAt)YV_%5wK+dGV}U;B7Zep@xzXZ60YZB^Rd zVZ7F^GpDs`dx!B_yW9(_b_X^$NsNpTD|nq)!M1nkrXB9z8R$8qM&w1Yu748iS`4Y5 z-4AxTL+)%3G;UohGM`qv?H#(68;EQSj2Ie-*xrEc9lB}9eX%M~b5g^I?Pb{BVZ7F^ zhp#?a9Ju#oa>VvtZ12!bd$-o?fOv=z+bgoYLpN=Q@23RBLyXwomhBz7X}_N{H1K)j z&KX{u?H#&loz|-D9lB}7GYn44nLlECowj%AroG(qZ-Lu~3Po&h*7gqFwBi{CX6`H& zvAty5J9N{YUwAhl9%2NZ;Q{dwZST;j#XZq$#f^Y?h!NYXx4lEB7S}Fm`PqPYh!J>( z=q<3l!+0$w_(8jP{?UMVh!J>(3*}z3y+b$crJ9j|c!-f7<=(|T47=8?J;U*izp^(V z9%2N~1fGqGS!kWTG5##H9S-YcHruf;=5$U-ZgVeoqLqOjeIRy7Ol+5D}7 z2g}X~+r4wuveM@05ZqC6eE6z(hHb?|O!Uy2?Mdq{!6vT_46hZ>@Eh?Et9xj1ZsHjR z%iZl6wtFdSWTACFZ}1MwNTU`TJe)XU*zn1|i_um_$w3`ba{sBHdC%c<5C_ZX;Sd=; z{B!o`q15s(%|8qo^~|FR838g#K1tRm8<0+HYZzBj)kUT^lCXbNslmF`eq5b~L^?>&u{6jA-{KMZk{6nV}?|MY| zhkYIXp;K$WgW(^xbohr}TKI>v9R8tGYuX!f4Db(2JN!eZ);n*L$B*p#p>;U9Ww-TXtR)~*LP|In$mk0Fiz;Y)G; zp_kUpKXhvCI)i^W+~FTOwe~TLrGHqLqfqb*gPNY2Exo zFRjzwgn#Izb@LCsw3l4`Loe+j7yr;pd(Oo_bZYHu4F9l!_=j6L>I?tSskN`gGxQJb z(Pa3CUfM-*{^0`phhAFvhn2-YMBfJPVfcq`S{(DZIR6kMi0}`+v~K>Pm)6Zcbkm|P z-26kQ)~;VS|In$m>(|Xc^wPTdhhADY|IkZ&PW;2S#Xn3J|F9kXLoaO(@eiAce`wD( zfq&?wb@LCsw9e-(esZZfdKhyL>+ULRl)pbD+dY)3$K!~At{4P7MhJLB5d7xf?BPSp zJ+!`Djw-R-L+i`sNL%iq^` E%(s+k~z|C@JB+nduY|eC=2G7)v;*}A6j2xN7@=b zw7#^C^aT8oFwuhfMRsgXX8L(@3OSXWM!rD4Nd9vTAIgtsn#Ub7mXX%*VaRxs=@sNk zauvCnTtluU*OBYV4dh$oMsgFmnY7%)kYTxp@>*lQ9k+;bY$&bi8h&+!28d358brCa+zG} zRc>#W$)#S}<}$f-p-e8d&4@g54qjSJF8!@cE}bGnhwC`G)J+SMN`?*t`#HI^Bqx`8 zX)(FJ*UXjVA zLu7JkRhj74gOf|Ww3u9ag_BFih#8FGLoaRo4p>9;buw5|+qg*my@ON+^+zjI73_0m?B$)$Z{ za_Ppn$)#S}-^t|CT#m`5URtNQYP*MS&l@I}KH->L>Qyc#m!>-=m%3?j|H{x|a0w@u zHsRz_H!bRSJSUg#le!IXa;Z~`GNFBvlS^yMHQUa~rB1Ewz6|8#(&jRBn3t1F-Lx1& z+$57rm&)YQx#Aj*;^a~L zX_vUkrC!?loLqWEo?$%8m0X@7yWC?kxl~-l$Zz5%mwJ`^lT0pM=$KsU)Y|ns+hua8 zm-ezuF6}OpON+)$E_G^gyomc{a_JeFT)Ily-WNEz)TyY$;%=Dq4Ayiz7DrE_Yz(3a59mekO~ zDO9cB(i++_8rrfN+Hx9Nj2Wt)8wM#3!sW@&FkoBjkJJLGloJm^?ySlSxB{HJLPIe8Bu;*V;>*u(!X*q`0&vGMeIfmBHawBayhStw>BW*c`*3WYzZ8?V4&vYYgIfmBH zbR%s!hStw@BW*c`*3We#{XZQowBLUVAMpNzW2mZyW2mZyW2mZyW2mZyW2mZyW2mZy zW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZy zW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mb2YiQvZs+J4K zP*n@ZP*n@ZP*n@ZP*n@ZP*n@ZP*n@ZP*n@ZP*n@ZuoxXfYaZ#C)@jDy&j*bIH%t8s zd4?eaPdzLhJkcPYRuE4jh^Gw169nSv0R1HHYNT<;g18$&+-V^0A`o{7h^r6c%7VCR z;N#>IWKFUbS(~gw)-`D@M1;)%(?Rk{vOd{>e2SEzVly-%8AXP9dj~)5sUd7s;2% zm&sSiSIOyQhgpuah^(o8&F>Hu)j>5qXFFm~;*q+V8)}1Kxi*Wq(y|E)8vN4Q(C`ZC(xSLmJwA z8ru9C+J`l?1vIn;HME5^w1qXak7#I%XlRRSXp3oRi)(00XlP4nXiI5mOKWJ$XlTo7 zXv=A6%WG&WXlNhR&_1T2t*D{(YiKKJXe(=It7vEwG_+MUwAD1Ui5lAK8rm8fT6l)V zrBRzSeB!uqW6as4>G#K<7_z2;QGU%hdHY*aqCtDm@IPeGP-6C=p;R-1-~5|BXxN1H z(3EUOHYZz_&DcdyqZJUSw~w580ROM?OnF zNA@QNkORp<7Wk{m^jCdZIt$#LX(asoM#oJ3A0pC_k~Q^{%M z3*?LBOXSPsE99%>bTUM~M$RB-lC#L! zNvwoC$oI*kgpuah^(o8&F>Hu)j>5qXFFm~^^^_WQ5&1Kxi*Wq(y|E)8vN4Q(C`ZC(xS zLmJwA8ru9C+J`l?1vIn;HME5^w1qXak7#I%XlRRSXp3oRi)(00XlP4nXiI5mOKWJ$ zXlTo7Xv=A6%WG&WXlNhR&_1T2t*D{(YiKKJXe(=It7vEwG_+MUwAD1Ui5lAK8rm8f zTDXSzg;KbNV`@J?ethc0!Q+O$;5*bhpRxOgA}P(rtPvC7=l=awj^7Tt;sfITe2P5p6oz&Bs-Cv$u4A9vK!f*>_PS+2FOV;iFOe^kuaK{j)5#F|8aacUNzNi?lXJ+qRBHiXxJGp~=n|z0Sm)uG2 zB6pK}$i3t~azA;143iP^J@O!Vh&)UlA>SvDk{^)A$m8S*QeF;bI7yx&Pm^cJv*bDQ zJb8hJq;xiqx7 zHMDs&w0SkO4{2!gX=w9nXdl+l7SPZZ)X)~v&=%IvKBA#5qMwAKzasCO~HY5MziF#Xl4uG21_sx<>Gu zf3y9=Caj01WHYik*@A3Iwjx`TZOFD{JF-35f$T_jB0G~^$gX5JvOC#>>`C?_dy{?0 zzGOf0S@JouKRJLLNDd+glS9a%WGb0P4kL$?Bgm2DC~`D8h8#8}+@)KkK>(HWG>)i5kx-X$;*Y4fY@dA{PLn7Xr zN8cQ1+BrT6gRDUy^RU&ZTnAd0+%I{OUU?@W-qW>xOT<@tO^WMAaP_LUztV0llN z`&#AIV0k^v&#;cQy5u#LePem@BM2-nwy)1uDu3^2)hi2AZY*zm5~bmI9(yKe<{inE zBgsC#3X->=-k(!uXXN>OWn|xlk{8?8=Sx`B&8Q{i-9LSkW>d&m@m}eZ$eaCaRPwCj zTPbu*!eT6rkWxAyZ2QRFRY^#qUE=UXj#*mr40UdTAY@@ATO*i(MYg5}N1$n*KO zvb^KwXP^#zz8x$tmM1@Jma}Wz+;Xy0_;uLr?6*XPa=(N*mbZ2VK>5VLmJz#pI~pnK7)OPG`3-< zz^;KE1Um$2Y{MRa{Q!Fd?|Y=NjrT6z(|E7ry^1up@qWYm5bw{5Ok*4G5xjT&67ilu z8rx{E(Z1t-fc6+^Y(Fj$?I_yaCz!@|ZHcuc)|6O>X>2#?*ro%{0|7c&RHP}|*3pA} zKC8oRVf7~qf7vCa%76_0?6fPl(Iz(qj71wg>XK(G%M7Xtwo0s$8V0hNz{i-Ld)f`E&IfQx{Di-Uj* zgMf>KfQx~Ei-dp+gn)~MfQy2Fi-mv-hk%QQ;5YyN|Lbu3nZqd8Z*rHm54?W3PU(tT zTuW6g9x7EW?g>>b?i*Dt?k!a~hoM+?*@S!n|>6p+m%yU6;9J z*Jv);<<#2GbNrHB)461qm$soS*_Gy4vdgKpk71ZB*;U`MWS3KmV}Kq@c1@5ayS8y< zV3;>v+D~Q4u5VO=?KZXAVqK1hj^Tw&gHADT@=aOA@xDq$a8>iO3&jxYHt`@RnR~|0e<)z&$OLi@hCA;Ry zl3gRYWS5t=k}TPEMV9QED);Vx$*RsUZ=72DcrSCwF0AIfflGEdwf6BkS5Wt7QSMV* zvg@im!(VdAE@!#+F&vjAySB=bUG|FaFmK$n(BGFOyXHHV>~d=D^*6vgR&@T*nVo!dE=!$AE^*Lb?I98 zj#xJP#lo?zoA_g}%iUa{Qcx_M@L{oRuCM85E=cNCZtjGHpjbHJyIgP(oi|?EliyYi z_F26zY`2Q&ym4ynI&-$RwsqrnycbsO4s33c7#Sh0_&RCD(Rt%6*FLx5{+)rIGipR$ zO2Mv4nVtj{?UL~I1yMj3*}xz=Z%;4 zQq4#}ES$)XV%gvxwyhiIG2nQ|U)dWF3nzkS0?$T8mvZs>&^o;de-_$~hZBR13hfTV zOTn{@&Ku|P+V`X^MjAZrdnerS)_~~e(ni?Ujoa}q__A&=_tTrhSEbFtLdfX6@hbO= zVhw`}3ak#>3oN7a#!D-fP4Ig1qHyA*j!}4l=)CdLp3UDXc(Ck@u*HL|G`sgkE{p`f`S+L8dt+a} zTo1T@uy4Gyuy20juy34N+^dMNZ~8jy8>iO3hhX2dbl5juTG%(U9QKV46tuX zJM0^$);%PI|$Mvi5fa_s}>&;?J@GJ6X?G2(qeGx3J0ggNHdP^8!v7A z;MA+~dO-J$m-ZZpx(#q}%Be+}&_2n* zsoHYQw#&7%%^SCK8_2<_=F)YOmxEKza#1F_a5l-{)KVFonk%NwC=O0}Y5g)dl`ex* zQ)r&s=1u%D*vET`gHyxgnOM)kDQCI1_Su1Z0_k(AMY_ndR!yEcze}Cj+WH)vx+2do zo@I33c$Irh2B*ZtiTsA$yXe00(*7iaQwtq~Q%)`F3~{#0;FOp4vJ6gjm%*u`af4G% zEzS*bzYI>Dk-@1|()PZvM^MpcV3DOD}Tq*S#qYE-o_YE-r8vr*Ne&qh@X zqefK=qefK=qefMWF)39o#-voWFltn_7?V=fVoXX^i!muxEyko&wJ>T_wHT99)nZIa zRSTm=Rf{nxRV|DfRV|!ERV~J(RJAZ_RJ9c~w0;dOj2hKrfKj8W#h8?;7GqMXT8v4l zYB46Is)bRbs>PU;sup8Xs#+K|H>Gh;9W>FJN^Gx}IsXCcL1!B_Qp*zj=HFkAVPjvv z?Df1;qmQT6Hy%_EFl#G~3>#G~3>#G~3>#G~3>#G~3>#G~3>#G~3>#G~44YdtZ1mUj z4&{)KVz4*S6@UOY9|0~r0^D;1xZVhGs}b;KLBLxB0dE8ZwDt&S$q~>>BcKIFK)#3P^xRp;yS5naV=G~ zxZbK-+!Lx=+&8LP+*_(z+<&TC+@q>m+{da~-0P}ZJP)c`JTt0VJXfk(JbS8IJfEss zJj1G5Jm;!fv<0eKv=^#cv?;1uv^%O=v`wm7v|p-Pv~j9hw1cWzw3Vt_w5O_CST?F! zST?F!ST?F!zlIi;jcU2DY*e+dY*e+dY*e+dY*e+dY*e+dY*e+dY*e+dY*e+dY;H^A z{@+}WHfGvjSPmg%Sf)+LuuL17S;>6Mvto&6-TtB5RX% z$e;bZ4c8OSUQf|lSNTEpfcsB%T}hZWs#=&fs#=&fs#=&fs#=&fs#=&fs#=&fs#=&f zs#-k5s#-kfs#>%Ks#>%cs#=&fs#=&fs#=&fs#=&fs#=&fs#=&fs#=&fs#=&fs#=&f zs#=&fs#=&fs#?E>7ViMna`B!})#6>Es>S<8Rf~6$suu4pRW06as#?7NRJC|Vs%l}{ z;2To^ll2s1_D$?J6D|AZm)3O?GOVr}nQkg|1iQoPx{=@AWZLSw2^m(`O~|miZbHUC zrt2nTSoTfGu7O~->7O~->7QwPEyt4y``$fyG>P#_n)d3??_c`ynXZET@UOZXWxVj zygOib;JpB%%?Ht*gJ`Qkw8J3USn&VN&{W94vxd*Za|GfU0sSWbwYxdtLYR&!|MXlL?qo_6eZxpp=|Ba&7 z?7vaen*BG5TC@K~QET?!C~D3A8%3?zf1{}NYdrI2|BYg~uy0h`60`qCv0StNMp0|_ a-zaL${u@QD*?*&`g?*!153p}kwf`5<-Z2;e literal 54175 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 From 0c9314fba795f98d0cd2bacec43a456d544278de Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 20 Apr 2021 19:28:35 +0200 Subject: [PATCH 101/176] Use different textures for blackstone top and side --- mods/ITEMS/mcl_blackstone/init.lua | 2 +- ...cl_blackstone.png => mcl_blackstone_side.png} | Bin .../textures/mcl_blackstone_top.png | Bin 0 -> 1656 bytes 3 files changed, 1 insertion(+), 1 deletion(-) rename mods/ITEMS/mcl_blackstone/textures/{mcl_blackstone.png => mcl_blackstone_side.png} (100%) create mode 100644 mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_top.png diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index c4a524d1fd..441a515910 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -45,7 +45,7 @@ local alldirs = {{x=0,y=0,z=1}, {x=1,y=0,z=0}, {x=0,y=0,z=-1}, {x=-1,y=0,z=0}, { minetest.register_node("mcl_blackstone:blackstone", { description = S("Blackstone"), - tiles = {"mcl_blackstone.png"}, + tiles = {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, groups = {cracky = 3, pickaxey=2, material_stone=1}, diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_side.png similarity index 100% rename from mods/ITEMS/mcl_blackstone/textures/mcl_blackstone.png rename to mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_side.png diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_top.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_top.png new file mode 100644 index 0000000000000000000000000000000000000000..a811c69404f315f347c27aeb9e3466322dc1ce34 GIT binary patch literal 1656 zcmV-;28a2HP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxw&N%a{MRaG2?!w&%fVpInH}`depmxmyGUyq zuYRBNllJquAh_ATz4t@N6GtWxF5v#5X1TTJJefdbM?cPYh;v75ENeopWgj%Gjd zrJt4=dsXeQ{5DW&nYeLRYmr*_5nXa#nes4$Izs6!owzBL)R%cJLBFi+&`Z=J8e&$( zimJJ3$$$~9vR%<(!Gsm}UT4heqO-dVT3ee{gVrY$Y_yr01g;gVHc+GjB&ttV)kwST z@&&uy*zIK$wOmkVT2wI96}JMPI{!~uK()55i)dtVrGDAAr`3(7Tzl#)6$I<#lsmt@ zz{|cdFT#>4$em`<0F&7U#Kw5;E$TXx&ST@ijH7{}OaP@wZL>OqqzV|1#OTokYXhS4 zD5_6V&n-E-sRGDs3qn!A9IQS5Pgcy>LIAQS;L?lXzHj<_=jy?v65@SqBjV6Uo zx;p8Mls3E3<~H8^7B<=9ma=Z2>@sJcLzWzKDz;G3<6nFUP^83?cHDIT9S{V@*r7sp`9Gcv0@VYB*JEin%^7oT_Pe2nPhVbiz$DRm?h6#Y0m- zH?(b<8A0c4Q?6-dqSZseR#ii8;uLI(se*1t%N3V)r*dC)19pF;n|)Fansk3dIcU;N z@$NJaq zs!{vMy(uP_J|`;wr4KqiYX=gx8XABPeE}bscL$zoJ){#3Ch&$btQ#|HOx$hTa~1hM zSF`xCOm6gTnzQfDJ~H%yM4Y^UzY}uBI|-t4IC4XToAqbzkJ{BEgcn}mi4a>3uJUk| zt-Vv6!x20jV+U!A^gH&lkq%^AMyz^&!PS8!S{yh|UGoS%aEQmFC$Q|mv-ui?ws$3-E1C>O(ft~ zq($e7U?HwZwp&++gjekCY3F=idlIDlz)8?a#5WgjShI#ZvCFR+m#VSU-WT4LSV(c5 z>ZGmolYZMnxbPZhz8%;7N;=-6pHah?us@l&?Sj{Rl%K*FjnnEkqwtB_l1Bn+cjr@X zI?v?Di*U>0ubJqc?DjBP5ij(^$8A>dNDud{u$+9qSzx5P-*Lu%1eogu9@DygO7s4- zaR!R8xaRFKF|CAV(}kdO6F|Kt81qB@kei^7`4Lw-6ShwWBlP96mXjFxfthEfmOtax zh1Y8r2G8{$dq6X4M~1`tLUU2RAyjSS2Q+kN^Mx24YJ`L;(K) z{{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jv0+3^fSxobVaO%yAonx^T90!fnWift6c-^Wuh83FL#lMjHP#WA{_)W-v3BI3QLl0Ge+ z-t``ae;A);`aZRV>#d|>B14^K)ZN9XyZr2*1e`^aHvo-{iml68vaZ_M?6E9Mj-pEt z5!U#%wObRC)_O{F`<&n*dm0V_r=U7~B}wAF2Vg&n?M|AyRZ4B-%@`A2%qUW0qYP~r zQeUnXXP0=^>kWktm+HKKY1X;KdHKo>UAllW#O6Q3;n^d{FY@aE0000 Date: Tue, 20 Apr 2021 19:31:42 +0200 Subject: [PATCH 102/176] Fix missing texture warning --- mods/ITEMS/mcl_blackstone/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index 441a515910..badcf99e40 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -55,7 +55,7 @@ minetest.register_node("mcl_blackstone:blackstone", { minetest.register_node("mcl_blackstone:blackstone_gilded", { description = S("Gilded Blackstone"), - tiles = {"mcl_blackstone.png^mcl_blackstone_gilded_side.png"}, + tiles = {"mcl_blackstone_side.png^mcl_blackstone_gilded_side.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, groups = {cracky = 3, pickaxey=2, material_stone=1, xp=1}, From 1db8c21ec230d91d00dfdcad635cdf5b187b5dff Mon Sep 17 00:00:00 2001 From: TechDudie Date: Tue, 20 Apr 2021 17:57:07 +0000 Subject: [PATCH 103/176] Emergency --- mods/ITEMS/mcl_sweet_berry/mod.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_sweet_berry/mod.conf b/mods/ITEMS/mcl_sweet_berry/mod.conf index 32dbf5da0e..0642018e97 100644 --- a/mods/ITEMS/mcl_sweet_berry/mod.conf +++ b/mods/ITEMS/mcl_sweet_berry/mod.conf @@ -1 +1,2 @@ -name=mcl_sweet_berry \ No newline at end of file +name=mcl_sweet_berry +depends=mcl_vars \ No newline at end of file From 3d776138e97b904c9b299119ae9b9a8a2811ae7a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 14:55:22 -0400 Subject: [PATCH 104/176] Start implementing creeper ai --- mods/ENTITIES/mcl_mobs/api/api.lua | 2 ++ mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 4 ++++ mods/ENTITIES/mobs_mc/creeper.lua | 3 +++ 3 files changed, 9 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 67865da6eb..64066ce21a 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -318,6 +318,8 @@ function mobs:register_mob(name, def) swim_in = def.swim_in or {mobs_mc.items.water_source, "mcl_core:water_flowing", mobs_mc.items.river_water_source}, pitch_switch = "static", jump_only = def.jump_only, + hostile = def.hostile, + neutral = def.neutral, --end j4i stuff -- MCL2 extensions diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index ce3e468b3c..1c40461889 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -596,6 +596,10 @@ mobs.mob_step = function(self, dtime) end + if self.hostile then + print("I'm a bad boi") + end + -- can mob be pushed, if so calculate direction -- do this last (overrides everything) if self.pushable then mobs.collision(self) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 0c884d5699..627ac50615 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -12,6 +12,9 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:creeper", { type = "monster", spawn_class = "hostile", + hostile = true, + neutral = false, + rotate = 270, hp_min = 20, hp_max = 20, xp_min = 5, From 1e5ae0bbac08dfd2013ba72c8c149509505589fa Mon Sep 17 00:00:00 2001 From: kay27 Date: Wed, 21 Apr 2021 00:36:07 +0400 Subject: [PATCH 105/176] [mcl_beds] Fix screwdriver/bed duplication glitch, https://git.minetest.land/MineClone2/MineClone2/issues/1149 --- mods/ITEMS/mcl_beds/api.lua | 147 +++++++++++++++++++++++------------- 1 file changed, 94 insertions(+), 53 deletions(-) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index a2df1bdf38..c0b25b1c58 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -1,23 +1,95 @@ local S = minetest.get_translator("mcl_beds") -local function destruct_bed(pos, oldnode) - local node = oldnode or minetest.get_node(pos) +local minetest_get_node = minetest.get_node +local minetest_get_node_or_nil = minetest.get_node_or_nil +local minetest_remove_node = minetest.remove_node +local minetest_facedir_to_dir = minetest.facedir_to_dir +local minetest_add_item = minetest.add_item +local vector_add = vector.add +local vector_subtract = vector.subtract + +local function get_bed_next_node(pos, node) + local node = node or minetest_get_node_or_nil(pos) if not node then return end - local dir = minetest.facedir_to_dir(node.param2) - local pos2, node2 + + local dir = minetest_facedir_to_dir(node.param2) + + local pos2, bottom if string.sub(node.name, -4) == "_top" then - pos2 = vector.subtract(pos, dir) - node2 = minetest.get_node(pos2) - if node2 and string.sub(node2.name, -7) == "_bottom" then - minetest.remove_node(pos2) - end - minetest.check_for_falling(pos) - elseif string.sub(node.name, -7) == "_bottom" then - minetest.add_item(pos, node.name) - pos2 = vector.add(pos, dir) - node2 = minetest.get_node(pos2) + pos2 = vector_subtract(pos, dir) + else + pos2 = vector_add(pos, dir) + bottom = true + end + + local node2 = minetest_get_node(pos2) + return pos2, node2, bottom, dir +end + +local function rotate(pos, node, user, mode, new_param2) + if mode ~= screwdriver.ROTATE_FACE then + return false + end + + local p, node2, bottom = get_bed_next_node(pos, node) + if not node2 then return end + + local name = node2.name + if not minetest.get_item_group(name, "bed") == 2 or not node.param2 == node2.param2 then return false end + + if bottom then + name = string.sub(name, 1, -5) + else + name = string.sub(name, 1, -8) + end + + if minetest.is_protected(p, user:get_player_name()) then + minetest.record_protection_violation(p, user:get_player_name()) + return false + end + + local new_dir, newp = minetest_facedir_to_dir(new_param2) + if bottom then + newp = vector_add(pos, new_dir) + else + newp = vector_subtract(pos, new_dir) + end + + local node3 = minetest_get_node_or_nil(newp) + if not node3 then return false end + + local node_def = minetest.registered_nodes[node3.name] + if not node_def or not node_def.buildable_to then return false end + + if minetest.is_protected(newp, user:get_player_name()) then + minetest.record_protection_violation(newp, user:get_player_name()) + return false + end + + node.param2 = new_param2 + -- do not remove_node here - it will trigger destroy_bed() + minetest.swap_node(p, {name = "air"}) + minetest.swap_node(pos, node) + minetest.swap_node(newp, {name = name .. (bottom and "_top" or "_bottom"), param2 = new_param2}) + + return true +end + + +local function destruct_bed(pos, oldnode) + local node = oldnode or minetest_get_node_or_nil(pos) + if not node then return end + + local pos2, node2, bottom = get_bed_next_node(pos, oldnode) + + if bottom then + minetest_add_item(pos, node.name) if node2 and string.sub(node2.name, -4) == "_top" then - minetest.remove_node(pos2) + minetest_remove_node(pos2) + end + else + if node2 and string.sub(node2.name, -7) == "_bottom" then + minetest_remove_node(pos2) end end end @@ -94,7 +166,7 @@ function mcl_beds.register_bed(name, def) local under = pointed_thing.under -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(under) + local node = minetest_get_node(under) if placer and not placer:get_player_control().sneak then if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack @@ -102,7 +174,7 @@ function mcl_beds.register_bed(name, def) end local pos - local undername = minetest.get_node(under).name + local undername = minetest_get_node(under).name if minetest.registered_items[undername] and minetest.registered_items[undername].buildable_to then pos = under else @@ -115,13 +187,13 @@ function mcl_beds.register_bed(name, def) return itemstack end - local node_def = minetest.registered_nodes[minetest.get_node(pos).name] + local node_def = minetest.registered_nodes[minetest_get_node(pos).name] if not node_def or not node_def.buildable_to then return itemstack end local dir = minetest.dir_to_facedir(placer:get_look_dir()) - local botpos = vector.add(pos, minetest.facedir_to_dir(dir)) + local botpos = vector_add(pos, minetest_facedir_to_dir(dir)) if minetest.is_protected(botpos, placer:get_player_name()) and not minetest.check_player_privs(placer, "protection_bypass") then @@ -129,7 +201,7 @@ function mcl_beds.register_bed(name, def) return itemstack end - local botdef = minetest.registered_nodes[minetest.get_node(botpos).name] + local botdef = minetest.registered_nodes[minetest_get_node(botpos).name] if not botdef or not botdef.buildable_to then return itemstack end @@ -152,38 +224,7 @@ function mcl_beds.register_bed(name, def) return itemstack end, - on_rotate = function(pos, node, user, mode, new_param2) - local dir = minetest.facedir_to_dir(node.param2) - local p = vector.add(pos, dir) - local node2 = minetest.get_node_or_nil(p) - if not node2 or not minetest.get_item_group(node2.name, "bed") == 2 or - not node.param2 == node2.param2 then - return false - end - if minetest.is_protected(p, user:get_player_name()) then - minetest.record_protection_violation(p, user:get_player_name()) - return false - end - if mode ~= screwdriver.ROTATE_FACE then - return false - end - local newp = vector.add(pos, minetest.facedir_to_dir(new_param2)) - local node3 = minetest.get_node_or_nil(newp) - local node_def = node3 and minetest.registered_nodes[node3.name] - if not node_def or not node_def.buildable_to then - return false - end - if minetest.is_protected(newp, user:get_player_name()) then - minetest.record_protection_violation(newp, user:get_player_name()) - return false - end - node.param2 = new_param2 - -- do not remove_node here - it will trigger destroy_bed() - minetest.set_node(p, {name = "air"}) - minetest.set_node(pos, node) - minetest.set_node(newp, {name = name .. "_top", param2 = new_param2}) - return true - end, + on_rotate = rotate, }) local node_box_top, selection_box_top, collision_box_top @@ -217,7 +258,7 @@ function mcl_beds.register_bed(name, def) mcl_beds.on_rightclick(pos, clicker, true) return itemstack end, - on_rotate = false, + on_rotate = rotate, after_destruct = destruct_bed, }) From ac08c6991c0ce7f9bb8d9de5880ec64a7882c3e7 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 16:39:05 -0400 Subject: [PATCH 106/176] Add in detect_players_in_area --- .../mcl_mobs/api/mob_functions/ai.lua | 9 ++- .../api/mob_functions/environment.lua | 61 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 1c40461889..ae28c8cdbc 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -597,7 +597,14 @@ mobs.mob_step = function(self, dtime) if self.hostile then - print("I'm a bad boi") + --true for line_of_sight is debug + --10 for radius is debug + --1 for eye height adjust is debug + local attacking = mobs.detect_players_in_area(self,true,10,1) + + if attacking then + print(attacking:get_player_name()) + end end -- can mob be pushed, if so calculate direction -- do this last (overrides everything) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index 082e88543f..7935dc7cc1 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -1,3 +1,7 @@ +local minetest_line_of_sight = minetest.line_of_sight + +local vector_new = vector.new + -- default function when mobs are blown up with TNT local do_tnt = function(obj, damage) @@ -9,4 +13,61 @@ local do_tnt = function(obj, damage) return false, true, {} end +--a fast function to be able to detect only players without using objects_in_radius +mobs.detect_players_in_area = function(self, line_of_sight, radius, object_height_adder) + + line_of_sight = line_of_sight or true --fallback line_of_sight + radius = radius or 10 -- fallback radius + object_height_adder = object_height_adder or 0 --fallback entity (y height) addition for line of sight + local pos1 = self.object:get_pos() + local players_in_area = {} + local winner_player = nil + local players_detected = 0 + + --get players in radius + for _,player in pairs(minetest.get_connected_players()) do + if player and player:get_hp() > 0 then + + local pos2 = player:get_pos() + + local distance = vector.distance(pos1,pos2) + + if distance <= radius then + if 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 + object_height_adder, pos1.z), + vector_new(pos2.x, pos2.y + player:get_properties().eye_height, pos2.z) + ) then + players_detected = players_detected + 1 + players_in_area[player] = distance + end + else + players_detected = players_detected + 1 + players_in_area[player] = distance + end + end + end + end + + + --return if there's no one near by + if players_detected <= 0 then --handle negative numbers for some crazy error that could possibly happen + return nil + end + + --do a default radius max + local shortest_disance = radius + 1 + + --sort through players and find the closest player + for player,distance in pairs(players_in_area) do + if distance < shortest_disance then + shortest_disance = distance + winner_player = player + end + end + + return(winner_player) +end From 348df0fcecc2709fe088493d5665112827f08129 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 16:46:10 -0400 Subject: [PATCH 107/176] Rename detect_players_in_area to detect_closest_player_within_radius --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 2 +- mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index ae28c8cdbc..1ad9cc6592 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -600,7 +600,7 @@ mobs.mob_step = function(self, dtime) --true for line_of_sight is debug --10 for radius is debug --1 for eye height adjust is debug - local attacking = mobs.detect_players_in_area(self,true,10,1) + local attacking = mobs.detect_closest_player_within_radius(self,true,10,1) if attacking then print(attacking:get_player_name()) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index 7935dc7cc1..b5d575ab01 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -14,7 +14,7 @@ local do_tnt = function(obj, damage) end --a fast function to be able to detect only players without using objects_in_radius -mobs.detect_players_in_area = function(self, line_of_sight, radius, object_height_adder) +mobs.detect_closest_player_within_radius = function(self, line_of_sight, radius, object_height_adder) line_of_sight = line_of_sight or true --fallback line_of_sight radius = radius or 10 -- fallback radius From 491ef6c8f818e43ef0545963eb27b5476c95ea28 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 16:48:20 -0400 Subject: [PATCH 108/176] Add in auto mob removal if something goes horribly wrong --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 1ad9cc6592..223399b298 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -574,6 +574,7 @@ mobs.mob_step = function(self, dtime) --do not continue if non-existent if not self or not self.object or not self.object:get_luaentity() then + self.object:remove() return false end From 008d670ed9006d918b1ed1698a5b644de27191b1 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 17:10:51 -0400 Subject: [PATCH 109/176] Remove wandering from ai --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 - .../mcl_mobs/api/mob_functions/ai.lua | 24 +++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 64066ce21a..81be0878f5 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -311,7 +311,6 @@ function mobs:register_mob(name, def) backface_culling = true, walk_timer = 0, stand_timer = 0, - wandering = true, current_animation = "", gravity = GRAVITY, swim = def.swim, diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 223399b298..5500d1b962 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -92,8 +92,17 @@ end local land_state_list_wandering = {"stand", "walk"} local land_state_switch = function(self, dtime) + + + if self.hostile and attack then + self.state = + return + end + + --do math after sure not attacking self.state_timer = self.state_timer - dtime - if self.wandering and self.state_timer <= 0 then + + if self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() self.state = land_state_list_wandering[math.random(1,#land_state_list_wandering)] end @@ -203,7 +212,7 @@ local swim_state_list_wandering = {"stand", "swim"} local swim_state_switch = function(self, dtime) self.state_timer = self.state_timer - dtime - if self.wandering and self.state_timer <= 0 then + if self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() self.state = swim_state_list_wandering[math.random(1,#swim_state_list_wandering)] end @@ -335,7 +344,7 @@ local fly_state_list_wandering = {"stand", "fly"} local fly_state_switch = function(self, dtime) self.state_timer = self.state_timer - dtime - if self.wandering and self.state_timer <= 0 then + if self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() self.state = fly_state_list_wandering[math.random(1,#fly_state_list_wandering)] end @@ -482,7 +491,7 @@ local jump_state_list_wandering = {"stand", "jump"} local jump_state_switch = function(self, dtime) self.state_timer = self.state_timer - dtime - if self.wandering and self.state_timer <= 0 then + if self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() self.state = jump_state_list_wandering[math.random(1,#jump_state_list_wandering)] end @@ -603,8 +612,13 @@ mobs.mob_step = function(self, dtime) --1 for eye height adjust is debug local attacking = mobs.detect_closest_player_within_radius(self,true,10,1) + --go get the closest player ROAR >:O if attacking then - print(attacking:get_player_name()) + self.attack = attacking + + --no player in area + else + self.attack = nil end end From cdb840609dc2586b31a1e44c8c1004379ef37979 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 20:19:55 -0400 Subject: [PATCH 110/176] Add in creeper basic prototype --- mods/ENTITIES/mcl_mobs/api/api.lua | 3 + .../mcl_mobs/api/mob_functions/ai.lua | 56 +++++++++++------ .../mcl_mobs/api/mob_functions/animation.lua | 50 +++++++++++++++- .../attack_type_instructions.lua | 60 +++++++++++++++++++ mods/ENTITIES/mobs_mc/creeper.lua | 4 +- 5 files changed, 150 insertions(+), 23 deletions(-) create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 81be0878f5..5734ee1c72 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -156,6 +156,7 @@ dofile(api_path .. "environment.lua") dofile(api_path .. "interaction.lua") dofile(api_path .. "movement.lua") dofile(api_path .. "set_up.lua") +dofile(api_path .. "attack_type_instructions.lua") mobs.spawning_mobs = {} @@ -319,6 +320,8 @@ function mobs:register_mob(name, def) jump_only = def.jump_only, hostile = def.hostile, neutral = def.neutral, + attacking = nil, + visual_size_origin = def.visual_size or {x = 1, y = 1, z = 1}, --end j4i stuff -- MCL2 extensions diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 5500d1b962..24942e3ec7 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -92,10 +92,9 @@ end local land_state_list_wandering = {"stand", "walk"} local land_state_switch = function(self, dtime) - - if self.hostile and attack then - self.state = + if self.hostile and self.attacking then + self.state = "attack" return end @@ -132,6 +131,11 @@ local land_state_execution = function(self,dtime) --set the velocity of the mob mobs.set_velocity(self,0) + --animation fixes for explosive mobs + if self.attack_type == "explode" then + mobs.reverse_explosion_animation(self,dtime) + end + elseif self.state == "walk" then self.walk_timer = self.walk_timer - dtime @@ -178,13 +182,20 @@ local land_state_execution = function(self,dtime) mobs.set_velocity(self,self.walk_velocity) end + --animation fixes for explosive mobs + if self.attack_type == "explode" then + mobs.reverse_explosion_animation(self,dtime) + end + elseif self.state == "run" then print("run") elseif self.state == "attack" then - print("attack") + if self.attack_type == "explode" then + mobs.explode_attack_walk(self, dtime) + end end @@ -587,6 +598,29 @@ mobs.mob_step = function(self, dtime) return false end + + if self.hostile then + --true for line_of_sight is debug + --10 for radius is debug + --1 for eye height adjust is debug + local attacking = mobs.detect_closest_player_within_radius(self,true,10,1) + + --go get the closest player ROAR >:O + if attacking then + self.attacking = attacking + --no player in area + else + + --reset states when coming out of hostile state + if self.attacking ~= nil then + self.state_timer = -1 + end + + self.attacking = nil + end + end + + --jump only (like slimes) if self.jump_only then jump_state_switch(self, dtime) @@ -606,21 +640,7 @@ mobs.mob_step = function(self, dtime) end - if self.hostile then - --true for line_of_sight is debug - --10 for radius is debug - --1 for eye height adjust is debug - local attacking = mobs.detect_closest_player_within_radius(self,true,10,1) - --go get the closest player ROAR >:O - if attacking then - self.attack = attacking - - --no player in area - else - self.attack = nil - end - end -- can mob be pushed, if so calculate direction -- do this last (overrides everything) if self.pushable then diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index 97d0f7894e..b7b8fa5748 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -1,11 +1,12 @@ local math_pi = math.pi local math_floor = math.floor +local math_random = math.random local HALF_PI = math_pi/2 - -local vector_distance = vector.distance -local vector_new = vector.new +local vector_direction = vector.direction +local vector_distance = vector.distance +local vector_new = vector.new local minetest_dir_to_yaw = minetest.dir_to_yaw @@ -114,6 +115,28 @@ mobs.movement_rotation_lock = function(self) end +--this is used when a mob is chasing a player +mobs.set_yaw_while_attacking = function(self) + + if self.object:get_properties().automatic_face_movement_dir then + self.object:set_properties{automatic_face_movement_dir = false} + end + + --turn positions into pseudo 2d vectors + local pos1 = self.object:get_pos() + pos1.y = 0 + + local pos2 = self.attacking:get_pos() + pos2.y = 0 + + local new_direction = vector_direction(pos1,pos2) + local new_yaw = minetest_dir_to_yaw(new_direction) + + self.object:set_yaw(new_yaw) + self.yaw = new_yaw +end + + local calculate_pitch = function(self) local pos = self.object:get_pos() local pos2 = self.old_pos @@ -156,4 +179,25 @@ mobs.set_static_pitch = function(self) self.object:set_rotation(current_rotation) self.pitch_switchfdas = "static" +end + +--this is a helper function for mobs explosion animation +mobs.handle_explosion_animation = function(self) + + --secondary catch-all + if not self.explosion_animation then + self.explosion_animation = 0 + end + + --the timer works from 0 for sense of a 0 based counting + --but this just bumps it up so it's usable in here + local explosion_timer_adjust = self.explosion_animation + 1 + + + local visual_size_modified = table.copy(self.visual_size_origin) + + visual_size_modified.x = visual_size_modified.x * (explosion_timer_adjust ^ 3) + visual_size_modified.y = visual_size_modified.y * explosion_timer_adjust + + self.object:set_properties({visual_size = visual_size_modified}) end \ No newline at end of file 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 new file mode 100644 index 0000000000..53a6ced4be --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua @@ -0,0 +1,60 @@ +local vector_direction = vector.direction +local minetest_dir_to_yaw = minetest.dir_to_yaw +local vector_distance = vector.distance + + +mobs.explode_attack_walk = function(self,dtime) + + --this needs an exception + if self.attacking == nil or not self.attacking:is_player() then + self.attacking = nil + return + end + + mobs.set_yaw_while_attacking(self) + + --make mob walk up to player within 2 nodes distance then start exploding + + --THIS NEEDS TO BE RECODED TO TAKE COLLISION BOXES INTO ACCOUNT!!! + if vector_distance(self.object:get_pos(), self.attacking:get_pos()) >= self.reach then + mobs.set_velocity(self, self.run_velocity) + mobs.set_mob_animation(self,"run") + + mobs.reverse_explosion_animation(self,dtime) + else + mobs.set_velocity(self,0) + + --this is the only way I can reference this without dumping extra data on all mobs + if not self.explosion_animation then + self.explosion_animation = 0 + end + mobs.set_mob_animation(self,"stand") + + mobs.handle_explosion_animation(self) + + self.explosion_animation = self.explosion_animation + (dtime/3) + end + + + --do biggening explosion thing + if self.explosion_animation and self.explosion_animation > self.explosion_timer then + mcl_explosions.explode(self.object:get_pos(), self.explosion_strength) + self.object:remove() + end +end + + +--this is a small helper function to make working with explosion animations easier +mobs.reverse_explosion_animation = function(self,dtime) + + + --if explosion animation was greater than 0 then reverse it + if self.explosion_animation ~= nil and self.explosion_animation > 0 then + self.explosion_animation = self.explosion_animation - dtime + if self.explosion_animation < 0 then + self.explosion_animation = 0 + end + end + + mobs.handle_explosion_animation(self) +end \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 627ac50615..6c26b422fe 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -169,8 +169,8 @@ mobs:register_mob("mobs_mc:creeper_charged", { explosion_radius = 8, explosion_damage_radius = 8, explosiontimer_reset_radius = 6, - reach = 3, - explosion_timer = 1.5, + reach = 2, + explosion_timer = 0.75, allow_fuse_reset = true, stop_to_explode = true, From 9678b556e17b124f841b0019b3a31880a415bd11 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 20:33:30 -0400 Subject: [PATCH 111/176] Fix crashes when trying to collision detect a removed mob --- mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua index 91feeb1927..47c5611bfd 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua @@ -9,6 +9,11 @@ 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 + --do collision detection from the base of the mob local collisionbox = self.object:get_properties().collisionbox From cd6f07537f64bdbe7573642982ec24ac3fb19ec1 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 20:43:45 -0400 Subject: [PATCH 112/176] Make creepers even more deadly --- .../attack_type_instructions.lua | 6 +++-- mods/ENTITIES/mobs_mc/creeper.lua | 22 +++++++++---------- 2 files changed, 15 insertions(+), 13 deletions(-) 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 53a6ced4be..edcbee1487 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 @@ -32,13 +32,15 @@ mobs.explode_attack_walk = function(self,dtime) mobs.handle_explosion_animation(self) - self.explosion_animation = self.explosion_animation + (dtime/3) + self.explosion_animation = self.explosion_animation + (dtime/2) + + print(self.explosion_animation) end --do biggening explosion thing if self.explosion_animation and self.explosion_animation > self.explosion_timer then - mcl_explosions.explode(self.object:get_pos(), self.explosion_strength) + mcl_explosions.explode(self.object:get_pos(), self.explosion_strength,{ drop_chance = 1.0 }) self.object:remove() end end diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 6c26b422fe..153d51231b 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -36,7 +36,7 @@ mobs:register_mob("mobs_mc:creeper", { explode = "tnt_explode", distance = 16, }, - makes_footstep_sound = true, + makes_footstep_sound = false, walk_velocity = 1.05, run_velocity = 2.1, runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, @@ -44,12 +44,12 @@ mobs:register_mob("mobs_mc:creeper", { --hssssssssssss - explosion_strength = 3, - explosion_radius = 3.5, - explosion_damage_radius = 3.5, + explosion_strength = 12, + explosion_radius = 6, + explosion_damage_radius = 8, explosiontimer_reset_radius = 6, reach = 3, - explosion_timer = 1.5, + explosion_timer = 0.3, allow_fuse_reset = true, stop_to_explode = true, @@ -159,18 +159,18 @@ mobs:register_mob("mobs_mc:creeper_charged", { explode = "tnt_explode", distance = 16, }, - makes_footstep_sound = true, + makes_footstep_sound = false, walk_velocity = 1.05, run_velocity = 2.1, runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, attack_type = "explode", - explosion_strength = 6, - explosion_radius = 8, - explosion_damage_radius = 8, - explosiontimer_reset_radius = 6, + explosion_strength = 24, + explosion_radius = 12, + explosion_damage_radius = 18, + explosiontimer_reset_radius = 10, reach = 2, - explosion_timer = 0.75, + explosion_timer = 0.3, allow_fuse_reset = true, stop_to_explode = true, From 0b763f54b55ea47b7889816612759447bfb50422 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 21:00:36 -0400 Subject: [PATCH 113/176] Finish creeper movement ai and move jump_check into environment --- .../mcl_mobs/api/mob_functions/ai.lua | 36 +---------------- .../attack_type_instructions.lua | 9 ++++- .../api/mob_functions/environment.lua | 39 +++++++++++++++++++ mods/ENTITIES/mobs_mc/creeper.lua | 1 + 4 files changed, 49 insertions(+), 36 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 24942e3ec7..6278822c4b 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -53,40 +53,6 @@ local cliff_check = function(self,dtime) return free_fall end ---check if a mob needs to jump -local jump_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 collisionbox = self.object:get_properties().collisionbox - local radius = collisionbox[4] + 0.5 - - vector_multiply(dir, radius) - - --only jump if there's a node and a non-solid node above it - local test_dir = vector.add(pos,dir) - - local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - - test_dir.y = test_dir.y + 1 - - local green_flag_2 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") == 0 - - 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 - --wall in front of mob - return(2) - end - - --nothing to jump over - return(0) -end - - -- state switching logic (stand, walk, run, attacks) local land_state_list_wandering = {"stand", "walk"} @@ -157,7 +123,7 @@ local land_state_execution = function(self,dtime) mobs.movement_rotation_lock(self) --check for nodes to jump over - local node_in_front_of = jump_check(self) + local node_in_front_of = mobs.jump_check(self) if node_in_front_of == 1 then 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 edcbee1487..e0e16691d4 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 @@ -34,7 +34,14 @@ mobs.explode_attack_walk = function(self,dtime) self.explosion_animation = self.explosion_animation + (dtime/2) - print(self.explosion_animation) + end + + --make explosive mobs jump + --check for nodes to jump over + --explosive mobs will just ride against walls for now + local node_in_front_of = mobs.jump_check(self) + if node_in_front_of == 1 then + mobs.jump(self) end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index b5d575ab01..f0aa8f45cf 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -1,6 +1,11 @@ local minetest_line_of_sight = minetest.line_of_sight +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 local vector_new = vector.new +local vector_multiply = vector.multiply -- default function when mobs are blown up with TNT local do_tnt = function(obj, damage) @@ -71,3 +76,37 @@ mobs.detect_closest_player_within_radius = function(self, line_of_sight, radius, return(winner_player) end + + +--check if a mob needs to jump +mobs.jump_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 collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector_multiply(dir, radius) + + --only jump if there's a node and a non-solid node above it + local test_dir = vector.add(pos,dir) + + local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 + + test_dir.y = test_dir.y + 1 + + local green_flag_2 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") == 0 + + 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 + --wall in front of mob + return(2) + end + + --nothing to jump over + return(0) +end \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 153d51231b..915f256ed4 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -151,6 +151,7 @@ mobs:register_mob("mobs_mc:creeper_charged", { "mobs_mc_creeper_charge.png"}, }, visual_size = {x=3, y=3}, + rotate = 270, sounds = { attack = "tnt_ignite", death = "mobs_mc_creeper_death", From bf367fffd054fe180dbc6d7f46e20e286d68bb09 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 21:34:18 -0400 Subject: [PATCH 114/176] Add in sound_handling and make explosion type mobs make their attack sound before explosion animation --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + .../attack_type_instructions.lua | 9 ++++-- .../api/mob_functions/sound_handling.lua | 32 +++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 5734ee1c72..e102430988 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -157,6 +157,7 @@ dofile(api_path .. "interaction.lua") dofile(api_path .. "movement.lua") dofile(api_path .. "set_up.lua") dofile(api_path .. "attack_type_instructions.lua") +dofile(api_path .. "sound_handling.lua") mobs.spawning_mobs = {} 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 e0e16691d4..1b89288396 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 @@ -14,8 +14,6 @@ mobs.explode_attack_walk = function(self,dtime) mobs.set_yaw_while_attacking(self) --make mob walk up to player within 2 nodes distance then start exploding - - --THIS NEEDS TO BE RECODED TO TAKE COLLISION BOXES INTO ACCOUNT!!! if vector_distance(self.object:get_pos(), self.attacking:get_pos()) >= self.reach then mobs.set_velocity(self, self.run_velocity) mobs.set_mob_animation(self,"run") @@ -28,12 +26,17 @@ mobs.explode_attack_walk = function(self,dtime) if not self.explosion_animation then self.explosion_animation = 0 end + + --play ignite sound + if self.explosion_animation == 0 then + mobs.play_sound(self,"attack") + end + mobs.set_mob_animation(self,"stand") mobs.handle_explosion_animation(self) self.explosion_animation = self.explosion_animation + (dtime/2) - end --make explosive mobs jump diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua new file mode 100644 index 0000000000..e699a1f29d --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua @@ -0,0 +1,32 @@ +local math_random = math.random + + +--generic call for sound handler for mobs (data access) +mobs.play_sound = function(self,sound) + local soundinfo = self.sounds + + if not soundinfo then + return + end + + local play_sound = soundinfo[sound] + + if not play_sound then + return + end + + mobs.play_sound_handler(self, play_sound) +end + + +--generic sound handler for mobs +mobs.play_sound_handler = function(self, sound) + local pitch = (100 + math_random(-15,15) + math_random()) / 100 + + minetest.sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = self.sounds.distance, + pitch = pitch, + }, true) +end \ No newline at end of file From fabd4d64e6745b9ea8c4bb1a76c190c2d66576be Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 21:35:19 -0400 Subject: [PATCH 115/176] Slow down creeper type mobs explosion buildup --- .../mcl_mobs/api/mob_functions/attack_type_instructions.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 1b89288396..9d1ba1bf30 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 @@ -36,7 +36,7 @@ mobs.explode_attack_walk = function(self,dtime) mobs.handle_explosion_animation(self) - self.explosion_animation = self.explosion_animation + (dtime/2) + self.explosion_animation = self.explosion_animation + (dtime/2.5) end --make explosive mobs jump @@ -59,7 +59,6 @@ end --this is a small helper function to make working with explosion animations easier mobs.reverse_explosion_animation = function(self,dtime) - --if explosion animation was greater than 0 then reverse it if self.explosion_animation ~= nil and self.explosion_animation > 0 then self.explosion_animation = self.explosion_animation - dtime From d371d6fdc9cb85e140399eafb89f15195f72d09f Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 22:04:54 -0400 Subject: [PATCH 116/176] Adjust creeper explosion settings --- mods/ENTITIES/mobs_mc/creeper.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 915f256ed4..830a51dafc 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -44,9 +44,9 @@ mobs:register_mob("mobs_mc:creeper", { --hssssssssssss - explosion_strength = 12, - explosion_radius = 6, - explosion_damage_radius = 8, + explosion_strength = 10, + explosion_radius = 4, + explosion_damage_radius = 6, explosiontimer_reset_radius = 6, reach = 3, explosion_timer = 0.3, From 6b52b945165a8501e09ca70c18514049df194c05 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 22:30:34 -0400 Subject: [PATCH 117/176] Start setting up hostile punch attack type --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + .../mcl_mobs/api/mob_functions/ai.lua | 15 +++++++++++ .../attack_type_instructions.lua | 25 +++++++++++++++++++ mods/ENTITIES/mobs_mc/zombie.lua | 3 +++ 4 files changed, 44 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index e102430988..1819ce0603 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -323,6 +323,7 @@ function mobs:register_mob(name, def) neutral = def.neutral, attacking = nil, visual_size_origin = def.visual_size or {x = 1, y = 1, z = 1}, + punch_timer_cooloff = def.punch_timer_cooloff or 0.5, --end j4i stuff -- MCL2 extensions diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 6278822c4b..1c15f3a587 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -159,8 +159,15 @@ local land_state_execution = function(self,dtime) elseif self.state == "attack" then + --execute mob attack type if self.attack_type == "explode" then + mobs.explode_attack_walk(self, dtime) + + elseif self.attack_type == "punch" then + + mobs.punch_attack_walk(self,dtime) + end end @@ -573,6 +580,14 @@ mobs.mob_step = function(self, dtime) --go get the closest player ROAR >:O if attacking then + + --set initial punch timer + if self.attacking == nil then + if self.attack_type == "punch" then + self.punch_timer = -1 + end + end + self.attacking = attacking --no player in area else 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 9d1ba1bf30..873cc5d629 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 @@ -68,4 +68,29 @@ mobs.reverse_explosion_animation = function(self,dtime) end mobs.handle_explosion_animation(self) +end + + + + +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 + return + end + + mobs.set_yaw_while_attacking(self) + + mobs.set_velocity(self, self.run_velocity) + + mobs.set_mob_animation(self, "run") + + if self.punch_timer > 0 then + self.punch_timer = self.punch_timer - dtime + end + + print(self.punch_timer) + end \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 4d88b25772..14377de3e4 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -48,6 +48,8 @@ table.insert(drops_zombie, { local zombie = { type = "monster", spawn_class = "hostile", + hostile = true, + rotate = 270, hp_min = 20, hp_max = 20, xp_min = 5, @@ -89,6 +91,7 @@ local zombie = { sunlight_damage = 2, view_range = 16, attack_type = "punch", + punch_timer_cooloff = 0.5, harmed_by_heal = true, } From 751c4c2d995a011a3298d374c77b9c4567ed2fa1 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 22:41:13 -0400 Subject: [PATCH 118/176] Integrate mob punching into collision detection --- .../api/mob_functions/attack_type_instructions.lua | 9 ++++++++- .../mcl_mobs/api/mob_functions/collision.lua | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) 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 873cc5d629..679ef5025a 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 @@ -90,7 +90,14 @@ mobs.punch_attack_walk = function(self,dtime) if self.punch_timer > 0 then self.punch_timer = self.punch_timer - dtime end +end - print(self.punch_timer) +mobs.punch_attack = function(self) + self.attacking:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self.damage} + }, nil) + + self.punch_timer = self.punch_timer_cooloff 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 47c5611bfd..19d709329f 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua @@ -29,6 +29,13 @@ mobs.collision = function(self) local collision_count = 0 + + local check_for_attack = false + + if self.hostile and self.attacking then + check_for_attack = true + end + 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()._cmi_is_mob == true) then--and --don't collide with rider, rider don't collide with thing @@ -85,6 +92,13 @@ mobs.collision = function(self) if object:is_player() then vel2 = vector_multiply(vel2, 2.5) + + --integrate mob punching into collision detection + if check_for_attack and self.punch_timer <= 0 then + if object == self.attacking then + mobs.punch_attack(self) + end + end end self.object:add_velocity(vel1) From 60ac3058ce1e3e05caa87c18bdf95c78a71ed750 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 22:42:51 -0400 Subject: [PATCH 119/176] Make zombies more difficult --- mods/ENTITIES/mobs_mc/zombie.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 14377de3e4..93550a42aa 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -71,8 +71,8 @@ local zombie = { damage = "mobs_mc_zombie_hurt", distance = 16, }, - walk_velocity = .8, - run_velocity = 1.6, + walk_velocity = 1, + run_velocity = 3, damage = 3, reach = 2, fear_height = 4, From a05ebd7cc29c96b622dbc043529513b07d5cf47b Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 22:44:34 -0400 Subject: [PATCH 120/176] Add informative text art --- .../attack_type_instructions.lua | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) 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 679ef5025a..0f4d2bcb1c 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,7 +1,16 @@ local vector_direction = vector.direction local minetest_dir_to_yaw = minetest.dir_to_yaw local vector_distance = vector.distance - +--[[ + _____ _ _ +| ___| | | | | +| |____ ___ __ | | ___ __| | ___ +| __\ \/ / '_ \| |/ _ \ / _` |/ _ \ +| |___> <| |_) | | (_) | (_| | __/ +\____/_/\_\ .__/|_|\___/ \__,_|\___| + | | + |_| +]]-- mobs.explode_attack_walk = function(self,dtime) @@ -73,6 +82,17 @@ end +--[[ +______ _ +| ___ \ | | +| |_/ / _ _ __ ___| |__ +| __/ | | | '_ \ / __| '_ \ +| | | |_| | | | | (__| | | | +\_| \__,_|_| |_|\___|_| |_| +]]-- + + + mobs.punch_attack_walk = function(self,dtime) --this needs an exception From 8c9356a18cb60cd28691e3782723df763b75a1fa Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 22:58:39 -0400 Subject: [PATCH 121/176] Implement eye_height and viewing range for hostile mobs, along with making punchy mobs jump over nodes --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 4 +--- .../api/mob_functions/attack_type_instructions.lua | 9 +++++++++ mods/ENTITIES/mobs_mc/creeper.lua | 2 +- mods/ENTITIES/mobs_mc/zombie.lua | 1 + 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 1819ce0603..fcec541775 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -345,6 +345,7 @@ function mobs:register_mob(name, def) fire_resistant = def.fire_resistant or false, fire_damage_resistant = def.fire_damage_resistant or false, ignited_by_sunlight = def.ignited_by_sunlight or false, + eye_height = def.eye_height or 1.5, -- End of MCL2 extensions on_spawn = def.on_spawn, diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 1c15f3a587..8dbe49a972 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -574,9 +574,7 @@ mobs.mob_step = function(self, dtime) if self.hostile then --true for line_of_sight is debug - --10 for radius is debug - --1 for eye height adjust is debug - local attacking = mobs.detect_closest_player_within_radius(self,true,10,1) + local attacking = mobs.detect_closest_player_within_radius(self,true,self.view_range,self.eye_height) --go get the closest player ROAR >:O if attacking then 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 0f4d2bcb1c..34a87a745b 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 @@ -107,6 +107,15 @@ mobs.punch_attack_walk = function(self,dtime) mobs.set_mob_animation(self, "run") + --make punchy mobs jump + --check for nodes to jump over + --explosive mobs will just ride against walls for now + local node_in_front_of = mobs.jump_check(self) + if node_in_front_of == 1 then + mobs.jump(self) + end + + if self.punch_timer > 0 then self.punch_timer = self.punch_timer - dtime end diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 830a51dafc..8bb0897c7d 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -41,7 +41,7 @@ mobs:register_mob("mobs_mc:creeper", { run_velocity = 2.1, runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, attack_type = "explode", - + eye_height = 1.25, --hssssssssssss explosion_strength = 10, diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 93550a42aa..915f12e7b2 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -71,6 +71,7 @@ local zombie = { damage = "mobs_mc_zombie_hurt", distance = 16, }, + eye_height = 1.65, walk_velocity = 1, run_velocity = 3, damage = 3, From 1ed3377559c4690fa19488f526bcaf97d5ff94b1 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 23:11:18 -0400 Subject: [PATCH 122/176] Add punch mobs knockback to players when hit --- .../mob_functions/attack_type_instructions.lua | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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 34a87a745b..a532cd1eb2 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,6 +1,7 @@ local vector_direction = vector.direction local minetest_dir_to_yaw = minetest.dir_to_yaw local vector_distance = vector.distance +local vector_multiply = vector.multiply --[[ _____ _ _ | ___| | | | | @@ -129,4 +130,20 @@ mobs.punch_attack = function(self) }, nil) self.punch_timer = self.punch_timer_cooloff + + + --knockback + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = self.attacking:get_pos() + pos2.y = 0 + local dir = vector_direction(pos1,pos2) + + dir = vector_multiply(dir,3) + + if self.attacking:get_velocity().y <= 1 then + dir.y = 5 + end + + self.attacking:add_velocity(dir) end \ No newline at end of file From 2c87bd19f3c6a4a5a1a3b88a45cd673ecccb838b Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 23:14:53 -0400 Subject: [PATCH 123/176] Overhaul zombie villager --- mods/ENTITIES/mobs_mc/villager_zombie.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index f6eff6e0ab..7e975fe5e2 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -28,6 +28,9 @@ local professions = { mobs:register_mob("mobs_mc:villager_zombie", { type = "monster", spawn_class = "hostile", + hostile = true, + rotate = 270, + eye_height = 1.65, hp_min = 20, hp_max = 20, xp_min = 5, From 576621169b468f317cf32d6d0be391252a033d3a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Tue, 20 Apr 2021 23:26:18 -0400 Subject: [PATCH 124/176] Make creepers and zombies even harder --- mods/ENTITIES/mobs_mc/creeper.lua | 2 +- mods/ENTITIES/mobs_mc/villager_zombie.lua | 2 +- mods/ENTITIES/mobs_mc/zombie.lua | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 8bb0897c7d..ee5c7fcfe1 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -38,7 +38,7 @@ mobs:register_mob("mobs_mc:creeper", { }, makes_footstep_sound = false, walk_velocity = 1.05, - run_velocity = 2.1, + run_velocity = 3.25, runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, attack_type = "explode", eye_height = 1.25, diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index 7e975fe5e2..23365e5fe6 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -53,7 +53,7 @@ mobs:register_mob("mobs_mc:villager_zombie", { damage = 3, reach = 2, walk_velocity = 1.2, - run_velocity = 2.4, + run_velocity = 3.5, attack_type = "punch", group_attack = true, drops = { diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 915f12e7b2..55e9f0662b 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -73,7 +73,7 @@ local zombie = { }, eye_height = 1.65, walk_velocity = 1, - run_velocity = 3, + run_velocity = 3.5, damage = 3, reach = 2, fear_height = 4, From 486959515ca13ba0d5756ba5d930ff43e9d135b5 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 10:20:31 -0400 Subject: [PATCH 125/176] Make creepers even more dangerous --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + .../api/mob_functions/attack_type_instructions.lua | 7 ++++++- mods/ENTITIES/mobs_mc/creeper.lua | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index fcec541775..756366bbe7 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -346,6 +346,7 @@ function mobs:register_mob(name, def) fire_damage_resistant = def.fire_damage_resistant or false, ignited_by_sunlight = def.ignited_by_sunlight or false, eye_height = def.eye_height or 1.5, + defuse_reach = def.defuse_reach or 4, -- End of MCL2 extensions on_spawn = def.on_spawn, 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 a532cd1eb2..842b79192b 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 @@ -23,8 +23,13 @@ mobs.explode_attack_walk = function(self,dtime) mobs.set_yaw_while_attacking(self) + local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) + --make mob walk up to player within 2 nodes distance then start exploding - if vector_distance(self.object:get_pos(), self.attacking:get_pos()) >= self.reach then + if distance_from_attacking >= self.reach and + --don't allow explosion to cancel unless out of the reach boundary + not (self.explosion_animation ~= nil and self.explosion_animation > 0 and distance_from_attacking <= self.defuse_reach) then + mobs.set_velocity(self, self.run_velocity) mobs.set_mob_animation(self,"run") diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index ee5c7fcfe1..fdc980a491 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -48,7 +48,8 @@ mobs:register_mob("mobs_mc:creeper", { explosion_radius = 4, explosion_damage_radius = 6, explosiontimer_reset_radius = 6, - reach = 3, + reach = 1.5, + defuse_reach = 4, explosion_timer = 0.3, allow_fuse_reset = true, stop_to_explode = true, From cc2a0ae52cefc388d18c9d106ef70fc0718f5e40 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 10:21:11 -0400 Subject: [PATCH 126/176] Complete charged creeper --- mods/ENTITIES/mobs_mc/creeper.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index fdc980a491..559f2e703d 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -171,7 +171,8 @@ mobs:register_mob("mobs_mc:creeper_charged", { explosion_radius = 12, explosion_damage_radius = 18, explosiontimer_reset_radius = 10, - reach = 2, + reach = 1.5, + defuse_reach = 4, explosion_timer = 0.3, allow_fuse_reset = true, stop_to_explode = true, From f1dc2864425bab2eed2f5bec7b7ccd0307145b1f Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 10:23:51 -0400 Subject: [PATCH 127/176] Dump mob_punch from backup_code_api.lua back into interaction.lua --- .../api/mob_functions/backup_code_api.lua | 274 ----------------- .../api/mob_functions/interaction.lua | 277 +++++++++++++++++- 2 files changed, 276 insertions(+), 275 deletions(-) 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.lua index 2c1ba19832..0364e70c0e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua @@ -2300,280 +2300,6 @@ local day_docile = function(self) end --- deal damage and effects when mob punched -local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) - - -- custom punch function - if self.do_punch then - - -- when false skip going any further - if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then - return - end - end - - -- error checking when mod profiling is enabled - if not tool_capabilities then - minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") - return - end - - local is_player = hitter:is_player() - - if is_player then - -- is mob protected? - if self.protected and minetest_is_protected(self.object:get_pos(), hitter:get_player_name()) then - return - end - - -- set/update 'drop xp' timestamp if hitted by player - self.xp_timestamp = minetest_get_us_time() - end - - - -- punch interval - local weapon = hitter:get_wielded_item() - local punch_interval = 1.4 - - -- exhaust attacker - if mod_hunger and is_player then - mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK) - end - - -- calculate mob damage - local damage = 0 - local armor = self.object:get_armor_groups() or {} - local tmp - - -- quick error check incase it ends up 0 (serialize.h check test) - if tflp == 0 then - tflp = 0.2 - end - - if use_cmi then - damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) - else - - for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do - - tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) - - if tmp < 0 then - tmp = 0.0 - elseif tmp > 1 then - tmp = 1.0 - end - - damage = damage + (tool_capabilities.damage_groups[group] or 0) - * tmp * ((armor[group] or 0) / 100.0) - end - end - - if weapon then - local fire_aspect_level = mcl_enchanting.get_enchantment(weapon, "fire_aspect") - if fire_aspect_level > 0 then - mcl_burning.set_on_fire(self.object, fire_aspect_level * 4) - end - end - - -- check for tool immunity or special damage - for n = 1, #self.immune_to do - - if self.immune_to[n][1] == weapon:get_name() then - - damage = self.immune_to[n][2] or 0 - break - end - end - - -- healing - if damage <= -1 then - self.health = self.health - math_floor(damage) - return - end - - if use_cmi then - - local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) - - if cancel then return end - 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) - if minetest_is_creative_enabled("") ~= true - and tool_capabilities then - if tool_capabilities.punch_attack_uses then - -- Without this delay, the wear does not work. Quite hacky ... - minetest_after(0, function(name) - local player = minetest.get_player_by_name(name) - if not player then return end - 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) - weapon:add_wear(wear) - hitter:set_wielded_item(weapon) - end - end, hitter:get_player_name()) - end - end - - local die = false - - -- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately. - if damage >= 0.1 then - - -- weapon sounds - if weapon:get_definition().sounds ~= nil then - - local s = math_random(0, #weapon:get_definition().sounds) - - minetest_sound_play(weapon:get_definition().sounds[s], { - object = self.object, --hitter, - max_hear_distance = 8 - }, true) - else - minetest_sound_play("default_punch", { - object = self.object, - max_hear_distance = 5 - }, true) - end - - damage_effect(self, damage) - - -- do damage - self.health = self.health - damage - - -- skip future functions if dead, except alerting others - if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then - die = true - end - - -- knock back effect (only on full punch) - if not die - and self.knock_back - and tflp >= punch_interval then - - local v = self.object:get_velocity() - local r = 1.4 - math_min(punch_interval, 1.4) - local kb = r * 2.0 - local up = 2 - - -- if already in air then dont go up anymore when hit - if v.y ~= 0 - or self.fly then - up = 0 - end - - -- direction error check - dir = dir or {x = 0, y = 0, z = 0} - - -- check if tool already has specific knockback value - if tool_capabilities.damage_groups["knockback"] then - kb = tool_capabilities.damage_groups["knockback"] - else - kb = kb * 1.5 - end - - - local luaentity - if hitter then - luaentity = hitter:get_luaentity() - end - if hitter and is_player then - local wielditem = hitter:get_wielded_item() - kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") - elseif luaentity and luaentity._knockback then - kb = kb + luaentity._knockback - end - - self.object:set_velocity({ - x = dir.x * kb, - y = dir.y * kb + up * 2, - z = dir.z * kb - }) - - self.pause_timer = 0.25 - end - end -- END if damage - - -- if skittish then run away - if not die and self.runaway == true and self.state ~= "flop" then - - local lp = hitter:get_pos() - local s = self.object:get_pos() - local vec = { - x = lp.x - s.x, - y = lp.y - s.y, - z = lp.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + 3 * math_pi / 2) - self.rotate - - if lp.x > s.x then - yaw = yaw + math_pi - end - - yaw = set_yaw(self, yaw, 6) - self.state = "runaway" - self.runaway_timer = 0 - self.following = nil - end - - local name = hitter:get_player_name() or "" - - -- attack puncher and call other mobs for help - if self.passive == false - and self.state ~= "flop" - and (self.child == false or self.type == "monster") - and hitter:get_player_name() ~= self.owner - and not mobs.invis[ name ] then - - if not die then - -- attack whoever punched mob - self.state = "" - do_attack(self, hitter) - end - - -- alert others to the attack - local objs = minetest_get_objects_inside_radius(hitter:get_pos(), self.view_range) - local obj = nil - - for n = 1, #objs do - - obj = objs[n]:get_luaentity() - - if obj then - - -- only alert members of same mob or friends - if obj.group_attack - and obj.state ~= "attack" - and obj.owner ~= name then - if obj.name == self.name then - do_attack(obj, hitter) - elseif type(obj.group_attack) == "table" then - for i=1, #obj.group_attack do - if obj.name == obj.group_attack[i] then - do_attack(obj, hitter) - break - end - end - end - end - - -- have owned mobs attack player threat - if obj.owner == name and obj.owner_loyal then - do_attack(obj, self.object) - end - end - end - end -end local mob_detach_child = function(self, child) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index 490ae85182..b36051a382 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -37,4 +37,279 @@ mobs.create_mob_on_rightclick = function(on_rightclick) on_rightclick(self, clicker) end end -end \ No newline at end of file +end + +-- deal damage and effects when mob punched +local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) + + -- custom punch function + if self.do_punch then + + -- when false skip going any further + if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then + return + end + end + + -- error checking when mod profiling is enabled + if not tool_capabilities then + minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") + return + end + + local is_player = hitter:is_player() + + if is_player then + -- is mob protected? + if self.protected and minetest_is_protected(self.object:get_pos(), hitter:get_player_name()) then + return + end + + -- set/update 'drop xp' timestamp if hitted by player + self.xp_timestamp = minetest_get_us_time() + end + + + -- punch interval + local weapon = hitter:get_wielded_item() + local punch_interval = 1.4 + + -- exhaust attacker + if mod_hunger and is_player then + mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK) + end + + -- calculate mob damage + local damage = 0 + local armor = self.object:get_armor_groups() or {} + local tmp + + -- quick error check incase it ends up 0 (serialize.h check test) + if tflp == 0 then + tflp = 0.2 + end + + if use_cmi then + damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) + else + + for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do + + tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) + + if tmp < 0 then + tmp = 0.0 + elseif tmp > 1 then + tmp = 1.0 + end + + damage = damage + (tool_capabilities.damage_groups[group] or 0) + * tmp * ((armor[group] or 0) / 100.0) + end + end + + if weapon then + local fire_aspect_level = mcl_enchanting.get_enchantment(weapon, "fire_aspect") + if fire_aspect_level > 0 then + mcl_burning.set_on_fire(self.object, fire_aspect_level * 4) + end + end + + -- check for tool immunity or special damage + for n = 1, #self.immune_to do + + if self.immune_to[n][1] == weapon:get_name() then + + damage = self.immune_to[n][2] or 0 + break + end + end + + -- healing + if damage <= -1 then + self.health = self.health - math_floor(damage) + return + end + + if use_cmi then + + local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) + + if cancel then return end + 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) + if minetest_is_creative_enabled("") ~= true + and tool_capabilities then + if tool_capabilities.punch_attack_uses then + -- Without this delay, the wear does not work. Quite hacky ... + minetest_after(0, function(name) + local player = minetest.get_player_by_name(name) + if not player then return end + 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) + weapon:add_wear(wear) + hitter:set_wielded_item(weapon) + end + end, hitter:get_player_name()) + end + end + + local die = false + + -- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately. + if damage >= 0.1 then + + -- weapon sounds + if weapon:get_definition().sounds ~= nil then + + local s = math_random(0, #weapon:get_definition().sounds) + + minetest_sound_play(weapon:get_definition().sounds[s], { + object = self.object, --hitter, + max_hear_distance = 8 + }, true) + else + minetest_sound_play("default_punch", { + object = self.object, + max_hear_distance = 5 + }, true) + end + + damage_effect(self, damage) + + -- do damage + self.health = self.health - damage + + -- skip future functions if dead, except alerting others + if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then + die = true + end + + -- knock back effect (only on full punch) + if not die + and self.knock_back + and tflp >= punch_interval then + + local v = self.object:get_velocity() + local r = 1.4 - math_min(punch_interval, 1.4) + local kb = r * 2.0 + local up = 2 + + -- if already in air then dont go up anymore when hit + if v.y ~= 0 + or self.fly then + up = 0 + end + + -- direction error check + dir = dir or {x = 0, y = 0, z = 0} + + -- check if tool already has specific knockback value + if tool_capabilities.damage_groups["knockback"] then + kb = tool_capabilities.damage_groups["knockback"] + else + kb = kb * 1.5 + end + + + local luaentity + if hitter then + luaentity = hitter:get_luaentity() + end + if hitter and is_player then + local wielditem = hitter:get_wielded_item() + kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") + elseif luaentity and luaentity._knockback then + kb = kb + luaentity._knockback + end + + self.object:set_velocity({ + x = dir.x * kb, + y = dir.y * kb + up * 2, + z = dir.z * kb + }) + + self.pause_timer = 0.25 + end + end -- END if damage + + -- if skittish then run away + if not die and self.runaway == true and self.state ~= "flop" then + + local lp = hitter:get_pos() + local s = self.object:get_pos() + local vec = { + x = lp.x - s.x, + y = lp.y - s.y, + z = lp.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + 3 * math_pi / 2) - self.rotate + + if lp.x > s.x then + yaw = yaw + math_pi + end + + yaw = set_yaw(self, yaw, 6) + self.state = "runaway" + self.runaway_timer = 0 + self.following = nil + end + + local name = hitter:get_player_name() or "" + + -- attack puncher and call other mobs for help + if self.passive == false + and self.state ~= "flop" + and (self.child == false or self.type == "monster") + and hitter:get_player_name() ~= self.owner + and not mobs.invis[ name ] then + + if not die then + -- attack whoever punched mob + self.state = "" + do_attack(self, hitter) + end + + -- alert others to the attack + local objs = minetest_get_objects_inside_radius(hitter:get_pos(), self.view_range) + local obj = nil + + for n = 1, #objs do + + obj = objs[n]:get_luaentity() + + if obj then + + -- only alert members of same mob or friends + if obj.group_attack + and obj.state ~= "attack" + and obj.owner ~= name then + if obj.name == self.name then + do_attack(obj, hitter) + elseif type(obj.group_attack) == "table" then + for i=1, #obj.group_attack do + if obj.name == obj.group_attack[i] then + do_attack(obj, hitter) + break + end + end + end + end + + -- have owned mobs attack player threat + if obj.owner == name and obj.owner_loyal then + do_attack(obj, self.object) + end + end + end + end +end From b0b1ec9436776fdc89edaf3046499a9e2cfaed0f Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 10:53:20 -0400 Subject: [PATCH 128/176] Implement zombie pigmen and make them turn hostile when punched --- mods/ENTITIES/mcl_mobs/api/api.lua | 2 +- .../mcl_mobs/api/mob_functions/interaction.lua | 13 ++++++++++++- mods/ENTITIES/mobs_mc/zombiepig.lua | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 756366bbe7..bafad36518 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -357,7 +357,7 @@ function mobs:register_mob(name, def) --do_punch = def.do_punch, - --on_punch = mob_punch, + on_punch = mobs.mob_punch, --on_breed = def.on_breed, diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index b36051a382..17a48e931f 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -1,3 +1,5 @@ +local math_floor = math.floor + mobs.feed_tame = function(self) return nil end @@ -40,8 +42,16 @@ mobs.create_mob_on_rightclick = function(on_rightclick) end -- deal damage and effects when mob punched -local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) +mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) + if self.neutral then + self.hostile = true + --hostile_cooldown timer is initialized here + self.hostile_cooldown_timer + end + + + --[[ -- custom punch function if self.do_punch then @@ -312,4 +322,5 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end end end + ]]-- end diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index efaf1b3967..4777cd7cb9 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -14,6 +14,8 @@ local pigman = { -- type="animal", passive=false: This combination is needed for a neutral mob which becomes hostile, if attacked type = "animal", passive = false, + neutral = true, + rotate = 270, spawn_class = "passive", hp_min = 20, hp_max = 20, From 5062d56a5d89346234f6125848799f32915b31a4 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 11:00:02 -0400 Subject: [PATCH 129/176] Implement neutral mob mechanics and partial implement of zombie pigmen --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 14 +++++++++++++- .../mcl_mobs/api/mob_functions/interaction.lua | 2 +- mods/ENTITIES/mobs_mc/creeper.lua | 1 - mods/ENTITIES/mobs_mc/zombiepig.lua | 1 + 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index bafad36518..37676f476c 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -347,6 +347,7 @@ function mobs:register_mob(name, def) ignited_by_sunlight = def.ignited_by_sunlight or false, eye_height = def.eye_height or 1.5, defuse_reach = def.defuse_reach or 4, + hostile_cooldown = def.hostile_cooldown or 15, -- End of MCL2 extensions on_spawn = def.on_spawn, diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 8dbe49a972..f735576ced 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -571,10 +571,11 @@ mobs.mob_step = function(self, dtime) return false end + local attacking = nil if self.hostile then --true for line_of_sight is debug - local attacking = mobs.detect_closest_player_within_radius(self,true,self.view_range,self.eye_height) + attacking = mobs.detect_closest_player_within_radius(self,true,self.view_range,self.eye_height) --go get the closest player ROAR >:O if attacking then @@ -599,6 +600,17 @@ mobs.mob_step = function(self, dtime) end end + --count down hostile cooldown timer when no players in range + if self.neutral and self.hostile and not attacking and self.hostile_cooldown_timer then + + self.hostile_cooldown_timer = self.hostile_cooldown_timer - dtime + + if self.hostile_cooldown_timer <= 0 then + self.hostile = false + self.hostile_cooldown_timer = 0 + end + end + --jump only (like slimes) if self.jump_only then diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index 17a48e931f..ed87710b72 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -47,7 +47,7 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) if self.neutral then self.hostile = true --hostile_cooldown timer is initialized here - self.hostile_cooldown_timer + self.hostile_cooldown_timer = self.hostile_cooldown end diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 559f2e703d..b94a61dea9 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -13,7 +13,6 @@ mobs:register_mob("mobs_mc:creeper", { type = "monster", spawn_class = "hostile", hostile = true, - neutral = false, rotate = 270, hp_min = 20, hp_max = 20, diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index 4777cd7cb9..af1da2962b 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -17,6 +17,7 @@ local pigman = { neutral = true, rotate = 270, spawn_class = "passive", + hostile_cooldown = 15, --seconds hp_min = 20, hp_max = 20, xp_min = 6, From 964ce9ccf7101aef387bdd5ec2213ba4ac361a51 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 11:42:01 -0400 Subject: [PATCH 130/176] Temporarily disable spawn eggs from setting owner --- mods/ENTITIES/mcl_mobs/api/api.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 37676f476c..b5a7d5579d 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -631,11 +631,13 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) local ent = mob:get_luaentity() -- don't set owner if monster or sneak pressed + --[[ if ent.type ~= "monster" and not placer:get_player_control().sneak then ent.owner = placer:get_player_name() ent.tamed = true end + ]]-- -- set nametag local nametag = itemstack:get_meta():get_string("name") From 6bd279255c7e4b5623afa39caae8f988127f7ac3 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 11:50:22 -0400 Subject: [PATCH 131/176] Fully implement zombie pigmen --- .../api/mob_functions/environment.lua | 56 +++++++++++++++++++ .../api/mob_functions/interaction.lua | 13 +++++ 2 files changed, 69 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index f0aa8f45cf..f4e0a3809f 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -3,10 +3,13 @@ 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 +local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius local vector_new = vector.new local vector_multiply = vector.multiply +local table_copy = table.copy + -- default function when mobs are blown up with TNT local do_tnt = function(obj, damage) @@ -109,4 +112,57 @@ mobs.jump_check = function(self,dtime) --nothing to jump over return(0) +end + +-- a helper function to quickly turn neutral passive mobs hostile +local turn_hostile = function(self,detected_mob) + --drop in variables for attacking (stops crash) + detected_mob.punch_timer = 0 + --set to hostile + detected_mob.hostile = true + --hostile_cooldown timer is initialized here + detected_mob.hostile_cooldown_timer = detected_mob.hostile_cooldown + --set target to the same + detected_mob.attacking = self.attacking +end + +--allow hostile mobs to signal to other mobs +--to switch from neutal passive to neutral hostile +mobs.group_attack_initialization = function(self) + + --get basic data + local friends_list = table_copy(self.group_attack) + local objects_in_area = minetest_get_objects_inside_radius(self.object:get_pos(), self.view_range) + + --get the player's name + local name = self.attacking:get_player_name() + + --re-use local variable + local detected_mob + + --run through mobs in viewing distance + for _,object in pairs(objects_in_area) do + if object and object:get_luaentity() then + detected_mob = object:get_luaentity() + -- only alert members of same mob or friends + if detected_mob._cmi_is_mob and detected_mob.state ~= "attack" and detected_mob.owner ~= name then + if detected_mob.name == self.name then + turn_hostile(self,detected_mob) + elseif type(detected_mob.group_attack) == "table" then + for _,id in pairs(self.group_attack) do + if detected_mob.name == id then + turn_hostile(self,detected_mob) + break + end + end + end + end + + --THIS NEEDS TO BE RE-IMPLEMENTED AS A GLOBAL HIT IN MOB_PUNCH!! + -- have owned mobs attack player threat + --if obj.owner == name and obj.owner_loyal then + -- do_attack(obj, self.object) + --end + end + end 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 ed87710b72..94507c4cc0 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -32,6 +32,7 @@ local on_rightclick_prefix = function(self, clicker) return false end +-- I have no idea what this does mobs.create_mob_on_rightclick = function(on_rightclick) return function(self, clicker) local stop = on_rightclick_prefix(self, clicker) @@ -41,13 +42,25 @@ mobs.create_mob_on_rightclick = function(on_rightclick) end end + -- deal damage and effects when mob punched mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) + --neutral passive mobs switch to neutral hostile if self.neutral then + + --drop in variables for attacking (stops crash) + self.attacking = hitter + self.punch_timer = 0 + self.hostile = true --hostile_cooldown timer is initialized here self.hostile_cooldown_timer = self.hostile_cooldown + + --initialize the group attack (check for other mobs in area, make them neutral hostile) + if self.group_attack then + mobs.group_attack_initialization(self) + end end From 74094938bb0918df12ffa778c95b966d7bd6c9f3 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 12:10:29 -0400 Subject: [PATCH 132/176] Fix crash with non-punch attack mobs in collision --- mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua index 19d709329f..be707b22bd 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua @@ -32,7 +32,7 @@ mobs.collision = function(self) local check_for_attack = false - if self.hostile and self.attacking then + if self.attack_type == "punch" and self.hostile and self.attacking then check_for_attack = true end From 99e808296b81f37a9e01d4b4beb02120526bb4e9 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 12:17:51 -0400 Subject: [PATCH 133/176] Add missing skeleton/stray run animation --- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index da3df4664b..0cf44efca4 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -15,6 +15,8 @@ local mod_bows = minetest.get_modpath("mcl_bows") ~= nil local skeleton = { type = "monster", spawn_class = "hostile", + hostile = true, + rotate = 270, hp_min = 20, hp_max = 20, xp_min = 6, @@ -73,6 +75,8 @@ local skeleton = { walk_speed = 15, walk_start = 40, walk_end = 60, + run_start = 40, + run_end = 60, run_speed = 30, shoot_start = 70, shoot_end = 90, From c9f71d66f52f2e80fea6cd01fcb2db30ae399c39 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 12:42:34 -0400 Subject: [PATCH 134/176] Implement skeletons/strays --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + .../mcl_mobs/api/mob_functions/ai.lua | 6 +- .../attack_type_instructions.lua | 55 +++++++++++++++++++ .../api/mob_functions/interaction.lua | 19 +++++++ mods/ENTITIES/mobs_mc/skeleton+stray.lua | 4 +- 5 files changed, 83 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index b5a7d5579d..d9e02f46d0 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -324,6 +324,7 @@ function mobs:register_mob(name, def) attacking = nil, visual_size_origin = def.visual_size or {x = 1, y = 1, z = 1}, punch_timer_cooloff = def.punch_timer_cooloff or 0.5, + projectile_cooldown = projectile_cooldown or 2, --end j4i stuff -- MCL2 extensions diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index f735576ced..347471be3e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -168,6 +168,10 @@ local land_state_execution = function(self,dtime) mobs.punch_attack_walk(self,dtime) + elseif self.attack_type == "projectile" then + + mobs.projectile_attack_walk(self,dtime) + end end @@ -602,7 +606,7 @@ mobs.mob_step = function(self, dtime) --count down hostile cooldown timer when no players in range if self.neutral and self.hostile and not attacking and self.hostile_cooldown_timer then - + self.hostile_cooldown_timer = self.hostile_cooldown_timer - dtime if self.hostile_cooldown_timer <= 0 then 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 842b79192b..35fe2f892e 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 @@ -2,6 +2,7 @@ local vector_direction = vector.direction local minetest_dir_to_yaw = minetest.dir_to_yaw local vector_distance = vector.distance local vector_multiply = vector.multiply + --[[ _____ _ _ | ___| | | | | @@ -151,4 +152,58 @@ mobs.punch_attack = function(self) end self.attacking:add_velocity(dir) +end + + + + +--[[ +______ _ _ _ _ +| ___ \ (_) | | (_) | +| |_/ / __ ___ _ ___ ___| |_ _| | ___ +| __/ '__/ _ \| |/ _ \/ __| __| | |/ _ \ +| | | | | (_) | | __/ (__| |_| | | __/ +\_| |_| \___/| |\___|\___|\__|_|_|\___| + _/ | + |__/ +]]-- + + +mobs.projectile_attack_walk = function(self,dtime) + + --this needs an exception + if self.attacking == nil or not self.attacking:is_player() then + self.attacking = nil + return + end + + mobs.set_yaw_while_attacking(self) + + local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) + + + if distance_from_attacking >= self.reach then + mobs.set_velocity(self, self.run_velocity) + mobs.set_mob_animation(self,"run") + else + mobs.set_velocity(self,0) + mobs.set_mob_animation(self,"stand") + end + + --do this to not load data into other mobs + if not self.projectile_timer then + self.projectile_timer = self.projectile_cooldown + end + + if self.projectile_timer > 0 then + self.projectile_timer = self.projectile_timer - dtime + + --shoot + if self.projectile_timer <= 0 then + --reset timer + self.projectile_timer = self.projectile_cooldown + mobs.shoot_projectile(self) + end + end + 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 94507c4cc0..7cbcd9a706 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -1,4 +1,5 @@ local math_floor = math.floor +local vector_direction = vector.direction mobs.feed_tame = function(self) return nil @@ -337,3 +338,21 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, 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 + + local pos2 = self.attacking:get_pos() + --add player eye height + pos2.y = pos2.y + self.attacking:get_properties().eye_height + + --get direction + local dir = vector_direction(pos1,pos2) + + --call internal shoot_arrow function + self.shoot_arrow(self,pos1,dir) +end \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 0cf44efca4..a14ec62d1e 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -22,6 +22,8 @@ local skeleton = { xp_min = 6, xp_max = 6, breath_max = -1, + eye_height = 1.5, + projectile_cooldown = 1.5, armor = {undead = 100, fleshy = 100}, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.98, 0.3}, pathfinding = 1, @@ -43,7 +45,7 @@ local skeleton = { walk_velocity = 1.2, run_velocity = 2.4, damage = 2, - reach = 2, + reach = 3, drops = { {name = mobs_mc.items.arrow, chance = 1, From ebd995fbd2eb089a37b659e9ae87c86562e3ed69 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 12:45:02 -0400 Subject: [PATCH 135/176] Simplify skeleton arrow damage calculation --- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index a14ec62d1e..0c6cacc207 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -95,7 +95,7 @@ local skeleton = { shoot_arrow = function(self, pos, dir) if mod_bows then -- 2-4 damage per arrow - local dmg = math.max(4, math.random(2, 8)) + local dmg = math.random(2,4) mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) end end, From 20886f54bb8887fb88ce0e0e0c6f28a789868740 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 12:48:23 -0400 Subject: [PATCH 136/176] Make shooty mobs jump --- .../api/mob_functions/attack_type_instructions.lua | 8 ++++++++ 1 file changed, 8 insertions(+) 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 35fe2f892e..452aa3ec23 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 @@ -206,4 +206,12 @@ mobs.projectile_attack_walk = function(self,dtime) end end + --make shooty mobs jump + --check for nodes to jump over + --explosive mobs will just ride against walls for now + local node_in_front_of = mobs.jump_check(self) + if node_in_front_of == 1 then + mobs.jump(self) + end + end \ No newline at end of file From 71c34823bc87b0892d4450b877fb1c78cd6ad416 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 12:56:36 -0400 Subject: [PATCH 137/176] Make tilt flying/swimming dynamic --- mods/ENTITIES/mcl_mobs/api/api.lua | 2 ++ .../mcl_mobs/api/mob_functions/ai.lua | 25 ++++++++++++++----- .../attack_type_instructions.lua | 1 + mods/ENTITIES/mobs_mc/blaze.lua | 1 + 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index d9e02f46d0..c08b811865 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -349,6 +349,8 @@ function mobs:register_mob(name, def) eye_height = def.eye_height or 1.5, defuse_reach = def.defuse_reach or 4, hostile_cooldown = def.hostile_cooldown or 15, + tilt_fly = def.tilt_fly or true, + tilt_swim = def.tilt_swim or true, -- End of MCL2 extensions on_spawn = def.on_spawn, diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 347471be3e..4c85d9b3a5 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -271,7 +271,9 @@ local swim_state_execution = function(self,dtime) mobs.set_swim_velocity(self,0) - mobs.set_static_pitch(self) + if self.tilt_swim then + mobs.set_static_pitch(self) + end elseif self.state == "swim" then @@ -301,7 +303,10 @@ local swim_state_execution = function(self,dtime) mobs.set_swim_velocity(self,self.walk_velocity) - mobs.set_dynamic_pitch(self) + --only enable tilt swimming if enabled + if self.tilt_swim then + mobs.set_dynamic_pitch(self) + end end --flop around if not inside swim node else @@ -310,7 +315,9 @@ local swim_state_execution = function(self,dtime) mobs.flop(self) - mobs.set_static_pitch(self) + if self.tilt_swim then + mobs.set_static_pitch(self) + end end end @@ -398,7 +405,9 @@ local fly_state_execution = function(self,dtime) mobs.set_fly_velocity(self,0) - mobs.set_static_pitch(self) + if self.tilt_fly then + mobs.set_static_pitch(self) + end elseif self.state == "fly" then @@ -426,7 +435,9 @@ local fly_state_execution = function(self,dtime) quick_rotate(self,dtime) end - mobs.set_dynamic_pitch(self) + if self.tilt_fly then + mobs.set_dynamic_pitch(self) + end mobs.set_fly_velocity(self,self.walk_velocity) end @@ -437,7 +448,9 @@ local fly_state_execution = function(self,dtime) mobs.float(self) - mobs.set_static_pitch(self) + if self.tilt_fly then + mobs.set_static_pitch(self) + end end end end 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 452aa3ec23..13aeea0875 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 @@ -195,6 +195,7 @@ mobs.projectile_attack_walk = function(self,dtime) self.projectile_timer = self.projectile_cooldown end + --run projectile timer if self.projectile_timer > 0 then self.projectile_timer = self.projectile_timer - dtime diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index d7e0a5c48f..6bc67300f7 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -17,6 +17,7 @@ mobs:register_mob("mobs_mc:blaze", { hp_max = 20, xp_min = 10, xp_max = 10, + tilt_fly = false, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.79, 0.3}, rotate = -180, visual = "mesh", From 91099c3be93689c2569f838a63e75e38ca382162 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 13:01:14 -0400 Subject: [PATCH 138/176] Fix auto-true statement for tilt fly/swim --- mods/ENTITIES/mcl_mobs/api/api.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index c08b811865..7723e16a69 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -349,8 +349,8 @@ function mobs:register_mob(name, def) eye_height = def.eye_height or 1.5, defuse_reach = def.defuse_reach or 4, hostile_cooldown = def.hostile_cooldown or 15, - tilt_fly = def.tilt_fly or true, - tilt_swim = def.tilt_swim or true, + tilt_fly = def.tilt_fly, + tilt_swim = def.tilt_swim, -- End of MCL2 extensions on_spawn = def.on_spawn, From 08c90c34e83c498ee2cc883a2cad9b98a269a850 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 13:05:46 -0400 Subject: [PATCH 139/176] Make parrots and squids work with tilt fly/swim --- mods/ENTITIES/mobs_mc/parrot.lua | 1 + mods/ENTITIES/mobs_mc/squid.lua | 1 + 2 files changed, 2 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index ef82884aa6..fb1bc6f9bc 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -19,6 +19,7 @@ mobs:register_mob("mobs_mc:parrot", { hp_max = 6, xp_min = 1, xp_max = 3, + tilt_fly = true, collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25}, visual = "mesh", mesh = "mobs_mc_parrot.b3d", diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index 09fa8b1283..53e99f7f92 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -17,6 +17,7 @@ mobs:register_mob("mobs_mc:squid", { xp_max = 3, armor = 100, rotate = 270, + tilt_swim = true, -- FIXME: If the squid is near the floor, it turns black collisionbox = {-0.4, 0.0, -0.4, 0.4, 0.9, 0.4}, visual = "mesh", From 29305f548db88b0b895ec747ebfbc092c51c4762 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 15:08:35 -0400 Subject: [PATCH 140/176] Overhaul arrow register, implement basic blaze, break parts of arrow register for now, remove fallback for detecting players --- mods/ENTITIES/mcl_mobs/api/api.lua | 51 +++++++---- .../mcl_mobs/api/mob_functions/ai.lua | 22 +++++ .../attack_type_instructions.lua | 85 +++++++++++++++++++ .../api/mob_functions/backup_code_api.lua | 32 +------ .../mcl_mobs/api/mob_functions/collision.lua | 28 ++++++ .../api/mob_functions/combat_interaction.lua | 1 - .../api/mob_functions/environment.lua | 40 ++++++++- .../mcl_mobs/api/mob_functions/movement.lua | 24 ++++++ mods/ENTITIES/mobs_mc/blaze.lua | 16 +++- 9 files changed, 245 insertions(+), 54 deletions(-) delete mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/combat_interaction.lua diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 7723e16a69..b6054f281b 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -48,6 +48,9 @@ local math_floor = math.floor -- localize vector functions local vector_new = vector.new local vector_length = vector.length +local vector_direction = vector.direction +local vector_normalize = vector.normalize +local vector_multiply = vector.multiply -- mob constants local MAX_MOB_NAME_LENGTH = 30 @@ -324,7 +327,7 @@ function mobs:register_mob(name, def) attacking = nil, visual_size_origin = def.visual_size or {x = 1, y = 1, z = 1}, punch_timer_cooloff = def.punch_timer_cooloff or 0.5, - projectile_cooldown = projectile_cooldown or 2, + projectile_cooldown = def.projectile_cooldown or 2, --end j4i stuff -- MCL2 extensions @@ -439,9 +442,13 @@ end -- END mobs:register_mob function -- register arrow for shoot attack function mobs:register_arrow(name, def) - if not name or not def then return end -- errorcheck + -- errorcheck + if not name or not def then + print("failed to register arrow entity") + return + end - minetest.register_entity(name, { + minetest.register_entity(name.."_entity", { physical = false, visual = def.visual, @@ -458,15 +465,17 @@ function mobs:register_arrow(name, def) switch = 0, owner_id = def.owner_id, rotate = def.rotate, - on_punch = function(self) - local vel = self.object:get_velocity() - --self.object:set_velocity({x=vel.x * -1, y=vel.y * -1, z=vel.z * -1}) - local pos = self.object:get_pos() + speed = def.speed or nil, + on_step = function(self) - if self.switch == 0 - or self.timer > 150 - or not within_limits(pos, 0) then + local vel = self.object:get_velocity() + + local pos = self.object:get_pos() + + if self.timer > 150 + or not mobs.within_limits(pos, 0) then mcl_burning.extinguish(self.object) + print("removing 1") self.object:remove(); return @@ -491,7 +500,7 @@ function mobs:register_arrow(name, def) if self.hit_node then - local node = node_ok(pos).name + local node = minetest_get_node(pos).name if minetest_registered_nodes[node].walkable then @@ -519,32 +528,42 @@ function mobs:register_arrow(name, def) if self.hit_player and player:is_player() then - self.hit_player(self, player) + mobs.arrow_hit(self, player) + + print("wow everything is fucked") self.object:remove(); return end + --[[ local entity = player:get_luaentity() if entity and self.hit_mob and entity._cmi_is_mob == true and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name then - self.hit_mob(self, player) + and entity.name ~= self.object:get_luaentity().name + and (self._shooter and entity.name ~= self._shooter:get_luaentity().name) then + + --self.hit_mob(self, player) self.object:remove(); return end + ]]-- + --[[ if entity and self.hit_object and (not entity._cmi_is_mob) and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name then - self.hit_object(self, player) + and entity.name ~= self.object:get_luaentity().name + and (self._shooter and entity.name ~= self._shooter:get_luaentity().name) then + + --self.hit_object(self, player) self.object:remove(); return end + ]]-- end end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 4c85d9b3a5..11c61f20f4 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -338,6 +338,12 @@ ______ _ local fly_state_list_wandering = {"stand", "fly"} local fly_state_switch = function(self, dtime) + + if self.hostile and self.attacking then + self.state = "attack" + return + end + self.state_timer = self.state_timer - dtime if self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() @@ -440,6 +446,22 @@ local fly_state_execution = function(self,dtime) end mobs.set_fly_velocity(self,self.walk_velocity) + elseif self.state == "attack" then + + --execute mob attack type + --if self.attack_type == "explode" then + + --mobs.explode_attack_fly(self, dtime) + + --elseif self.attack_type == "punch" then + + --mobs.punch_attack_fly(self,dtime) + + if self.attack_type == "projectile" then + + mobs.projectile_attack_fly(self,dtime) + + end end else --make the mob float 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 13aeea0875..e60c46aab1 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 @@ -3,6 +3,17 @@ local minetest_dir_to_yaw = minetest.dir_to_yaw local vector_distance = vector.distance local vector_multiply = vector.multiply +--[[ + _ _ _ _ +| | | | | | | | +| | | | __ _ _ __ __| | | | +| | | | / _` | '_ \ / _` | | | +|_| | |___| (_| | | | | (_| | |_| +(_) \_____/\__,_|_| |_|\__,_| (_) +]]-- + + + --[[ _____ _ _ | ___| | | | | @@ -215,4 +226,78 @@ mobs.projectile_attack_walk = function(self,dtime) mobs.jump(self) end +end + + + + + + + + + +--[[ + _ ______ _ _ +| | | ___| | | | +| | | |_ | |_ _ | | +| | | _| | | | | | | | +|_| | | | | |_| | |_| +(_) \_| |_|\__, | (_) + __/ | + |___/ +]]-- + + + + +--[[ +______ _ _ _ _ +| ___ \ (_) | | (_) | +| |_/ / __ ___ _ ___ ___| |_ _| | ___ +| __/ '__/ _ \| |/ _ \/ __| __| | |/ _ \ +| | | | | (_) | | __/ (__| |_| | | __/ +\_| |_| \___/| |\___|\___|\__|_|_|\___| + _/ | + |__/ +]]-- + +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 + + local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) + + if distance_from_attacking >= self.reach then + mobs.set_yaw_while_attacking(self) + mobs.set_pitch_while_attacking(self) + mobs.set_fly_velocity(self, self.run_velocity) + mobs.set_mob_animation(self,"run") + else + mobs.set_yaw_while_attacking(self) + mobs.set_pitch_while_attacking(self) + mobs.set_fly_velocity(self, 0) + mobs.set_mob_animation(self,"stand") + end + + + --do this to not load data into other mobs + if not self.projectile_timer then + self.projectile_timer = self.projectile_cooldown + end + + --run projectile timer + if self.projectile_timer > 0 then + self.projectile_timer = self.projectile_timer - dtime + + --shoot + if self.projectile_timer <= 0 then + --reset timer + self.projectile_timer = self.projectile_cooldown + mobs.shoot_projectile(self) + end + end end \ No newline at end of file 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.lua index 0364e70c0e..802201688e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua @@ -1565,25 +1565,7 @@ local function update_roll(self) self.object:set_properties({collisionbox = cbox}) end --- check if within physical map limits (-30911 to 30927) -local within_limits, wmin, wmax = nil, -30913, 30928 -within_limits = function(pos, radius) - 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 - 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 + -- is mob facing a cliff or danger local is_at_cliff_or_danger = function(self) @@ -1661,19 +1643,7 @@ local is_at_water_danger = function(self) end --- get node but use fallback for nil or unknown -local node_ok = function(pos, fallback) - fallback = fallback or mobs.fallback_node - - local node = minetest_get_node_or_nil(pos) - - if node and minetest_registered_nodes[node.name] then - return node - end - - return minetest_registered_nodes[fallback] -end -- environmental damage (water, lava, fire, light etc.) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua index be707b22bd..43b7592692 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua @@ -3,6 +3,8 @@ local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius local math_random = math.random local vector_multiply = vector.multiply +local vector_direction = vector.direction + local integer_test = {-1,1} mobs.collision = function(self) @@ -107,4 +109,30 @@ mobs.collision = function(self) end end +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} + }, nil) + + + --knockback + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = player:get_pos() + pos2.y = 0 + local dir = vector_direction(pos1,pos2) + + dir = vector_multiply(dir,3) + + if player:get_velocity().y <= 1 then + dir.y = 5 + end + + player:add_velocity(dir) end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/combat_interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/combat_interaction.lua deleted file mode 100644 index 5ba67b28c5..0000000000 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/combat_interaction.lua +++ /dev/null @@ -1 +0,0 @@ ---make mobs scan players and check distance then if direct line of sight then add to list and go after whichever one is closer \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index f4e0a3809f..c6a392e577 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -4,6 +4,8 @@ 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 local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius +local minetest_get_node_or_nil = minetest.get_node_or_nil +local minetest_registered_nodes = minetest.registered_nodes local vector_new = vector.new local vector_multiply = vector.multiply @@ -24,10 +26,6 @@ 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) - line_of_sight = line_of_sight or true --fallback line_of_sight - radius = radius or 10 -- fallback radius - object_height_adder = object_height_adder or 0 --fallback entity (y height) addition for line of sight - local pos1 = self.object:get_pos() local players_in_area = {} local winner_player = nil @@ -165,4 +163,38 @@ mobs.group_attack_initialization = function(self) --end end end +end + +-- check if within physical map limits (-30911 to 30927) +-- within_limits, wmin, wmax = nil, -30913, 30928 +mobs.within_limits = function(pos, radius) + 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 + 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 + +-- get node but use fallback for nil or unknown +mobs.node_ok = function(pos, fallback) + + fallback = fallback or mobs.fallback_node + + local node = minetest_get_node_or_nil(pos) + + if node and minetest_registered_nodes[node.name] then + return node + end + + return minetest_registered_nodes[fallback] end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index f983734ebe..811488396f 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -2,14 +2,17 @@ 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 vector functions local vector_new = vector.new local vector_length = vector.length local vector_multiply = vector.multiply +local vector_distance = vector.distance local minetest_yaw_to_dir = minetest.yaw_to_dir +local minetest_dir_to_yaw = minetest.dir_to_yaw local DEFAULT_JUMP_HEIGHT = 5 local DEFAULT_FLOAT_SPEED = 4 @@ -236,6 +239,27 @@ mobs.set_fly_velocity = function(self, v) end end +--a quick and simple pitch calculation between two vector positions +mobs.calculate_pitch = function(pos1, pos2) + + if pos1 == nil or pos2 == nil then + 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) +end + +--make mobs fly up or down based on their y difference +mobs.set_pitch_while_attacking = function(self) + local pos1 = self.object:get_pos() + local pos2 = self.attacking:get_pos() + + local pitch = mobs.calculate_pitch(pos2,pos1) + + self.pitch = pitch +end + + --[[ ___ diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 6bc67300f7..d88a84515c 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -18,6 +18,8 @@ mobs:register_mob("mobs_mc:blaze", { xp_min = 10, xp_max = 10, tilt_fly = false, + hostile = true, + rotate = 270, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.79, 0.3}, rotate = -180, visual = "mesh", @@ -36,7 +38,7 @@ mobs:register_mob("mobs_mc:blaze", { walk_velocity = .8, run_velocity = 1.6, damage = 6, - reach = 2, + reach = 4, -- don't want blaze getting too close pathfinding = 1, drops = { {name = mobs_mc.items.blaze_rod, @@ -76,6 +78,13 @@ mobs:register_mob("mobs_mc:blaze", { fear_height = 0, glow = 14, fire_resistant = true, + eye_height = 0.75, + shoot_arrow = function(self, pos, dir) + -- 2-4 damage per arrow + local dmg = math.random(2,4) + mcl_bows.shoot_arrow("mobs_mc:blaze_fireball", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + end, + do_custom = function(self) if self.state == "attack" and vector.distance(self.object:get_pos(), self.attack:get_pos()) < 1.2 then mcl_burning.set_on_fire(self.attack, 5) @@ -148,6 +157,7 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { visual_size = {x = 0.3, y = 0.3}, textures = {"mcl_fire_fire_charge.png"}, velocity = 15, + speed = 5, -- Direct hit, no fire... just plenty of pain hit_player = function(self, player) @@ -180,7 +190,9 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { -- Node hit, make fire hit_node = function(self, pos, node) - if node.name == "air" then + if node.name ~= "air" then + local pos_above = table.copy(pos) + pos_above.y = pos_above.y + 1 minetest.set_node(pos_above, {name=mobs_mc.items.fire}) else local v = self.object:get_velocity() From 6aa636449211b1bbec1297723281f72b4c76c4da Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 23:25:10 -0400 Subject: [PATCH 141/176] Fix sheep rotation --- mods/ENTITIES/mobs_mc/sheep.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index e6368a3f8a..30571d0a28 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -63,7 +63,7 @@ mobs:register_mob("mobs_mc:sheep", { xp_min = 1, xp_max = 3, collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.29, 0.45}, - + rotate = 270, visual = "mesh", visual_size = {x=3, y=3}, mesh = "mobs_mc_sheepfur.b3d", From 5e15af260bed13b07b295f558f5cb05bedaa7eae Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 23:25:19 -0400 Subject: [PATCH 142/176] Fix pig rotation --- mods/ENTITIES/mobs_mc/pig.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index 2751a8bebd..16cf7d0f02 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -6,6 +6,7 @@ mobs:register_mob("mobs_mc:pig", { type = "animal", spawn_class = "passive", runaway = true, + rotate = 270, hp_min = 10, hp_max = 10, xp_min = 1, From fbe3ccc5c05b5d5141737d3a73df3e4d14a33a33 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 21 Apr 2021 23:28:38 -0400 Subject: [PATCH 143/176] Delete current state of things comment --- mods/ENTITIES/mcl_mobs/api/api.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index b6054f281b..b2d5ba162f 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -1,7 +1,5 @@ -- API for Mobs Redo: MineClone 2 Delux 2.0 DRM Free Early Access Super Extreme Edition --- current state of things: How to? - -- mobs library mobs = {} From 7c1adeab459d452ac016108b588957082c1347c1 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 00:20:57 -0400 Subject: [PATCH 144/176] Hyper-optimize mob spawning --- mods/ENTITIES/mcl_mobs/api/spawning.lua | 265 ++++++++++++++---------- 1 file changed, 154 insertions(+), 111 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index 2875b27e23..412fbfc24f 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -9,6 +9,8 @@ local get_biome_name = minetest.get_biome_name local max = math.max local get_objects_inside_radius = minetest.get_objects_inside_radius local vector_distance = vector.distance +local table_copy = table.copy +local math_random = math.random -- range for mob count local aoc_range = 32 @@ -155,27 +157,15 @@ Overworld regular: local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false -mobs_spawn = false --- count how many mobs of one type are inside an area -local count_mobs = function(pos,mobtype) +-- count how many mobs are in an area +local count_mobs = function(pos) local num = 0 - local objs = get_objects_inside_radius(pos, aoc_range) - for n = 1, #objs do - local obj = objs[n]:get_luaentity() - if obj and obj.name and obj._cmi_is_mob then - -- count hostile mobs only - if mobtype == "hostile" then - if obj.spawn_class == "hostile" then - num = num + 1 - end - -- count passive mobs only - else - num = num + 1 - end + for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do + if object and object:get_luaentity() and object.name and object._cmi_is_mob then + num = num + 1 end end - return num end @@ -485,8 +475,8 @@ end local axis --inner and outer part of square donut radius -local inner = 1 -local outer = 65 +local inner = 15 +local outer = 64 local int = {-1,1} local position_calculation = function(pos) @@ -540,108 +530,161 @@ if mobs_spawn then local timer = 0 minetest.register_globalstep(function(dtime) timer = timer + dtime - if timer >= 8 then + if timer >= 10 then timer = 0 for _,player in pairs(minetest.get_connected_players()) do - for i = 1,math_random(3,8) do - repeat -- after this line each "break" means "continue" - local player_pos = player:get_pos() + -- after this line each "break" means "continue" + local do_mob_spawning = true + repeat + --don't need to get these variables more than once + --they happen in a single server step - local _,dimension = mcl_worlds.y_to_layer(player_pos.y) + local player_pos = player:get_pos() + local _,dimension = mcl_worlds.y_to_layer(player_pos.y) - if dimension == "void" or dimension == "default" then - break -- ignore void and unloaded area - end + if dimension == "void" or dimension == "default" then + break -- ignore void and unloaded area + end - local min,max = decypher_limits(player_pos.y) + local min,max = decypher_limits(player_pos.y) - local goal_pos = position_calculation(player_pos) + for i = 1,math_random(1,4) do + -- after this line each "break" means "continue" + local do_mob_algorithm = true + repeat - local spawning_position_list = find_nodes_in_area_under_air(new_vector(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) + local goal_pos = position_calculation(player_pos) + + local spawning_position_list = find_nodes_in_area_under_air(new_vector(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) + + --couldn't find node + if #spawning_position_list <= 0 then + break + end + + 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 + break + end + + --hard code mob limit in area to 10 for now + if count_mobs(spawning_position) >= 10 then + break + end + + local gotten_node = get_node(spawning_position).name + + if not gotten_node or gotten_node == "air" then --skip air nodes + break + end + + local gotten_biome = minetest.get_biome_data(spawning_position) + + if not gotten_biome then + break --skip if in unloaded area + end + + gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with + + --add this so mobs don't spawn inside nodes + spawning_position.y = spawning_position.y + 1 + + --only need to poll for node light if everything else worked + local gotten_light = get_node_light(spawning_position) + + local is_water = get_item_group(gotten_node, "water") ~= 0 + 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) + + --grab mob that fits into the spawning location + --randomly grab a mob, don't exclude any possibilities + local repeat_mob_search = true + repeat + + local skip = false + + --use this for removing table elements of mobs that do not match + local temp_index = math_random(1,#mob_library_worker_table) + + local temp_def = mob_library_worker_table[temp_index] + + --skip if something ridiculous happens (nil mob def) + --something truly horrible has happened if skip gets + --activated at this point + if not temp_def then + skip = true + end + + if not skip and (spawning_position.y < temp_def.min_height or spawning_position.y > temp_def.max_height) then + skip = true + end + + --skip if not correct dimension + if not skip and (temp_def.dimension ~= dimension) then + skip = true + end + + --skip if not in correct biome + if not skip and (not biome_check(temp_def.biomes, gotten_biome)) then + skip = true + end + + --don't spawn if not in light limits + if not skip and (gotten_light < temp_def.min_light or gotten_light > temp_def.max_light) then + skip = true + end + + --skip if not in correct spawning type + if not skip and (temp_def.type_of_spawning == "ground" and is_water) then + skip = true + end + + if not skip and (temp_def.type_of_spawning == "ground" and is_lava) then + skip = true + end + + --found a mob, exit out of loop + if not skip then + --print("found mob:"..temp_def.name) + mob_def = table_copy(temp_def) + break + else + --print("deleting temp index") + table.remove(mob_library_worker_table, temp_index) + end + + until repeat_mob_search == false --this is needed to sort through mobs randomly + + + --catch if went through all mobs and something went horribly wrong + --could not find a valid mob to spawn that fits the environment + if not mob_def then + break + end + + --adjust the position for water and lava mobs + if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then + spawning_position.y = spawning_position.y - 1 + end + + --print("spawning: " .. mob_def.name) + + --everything is correct, spawn mob + minetest.add_entity(spawning_position, mob_def.name) - --couldn't find node - if #spawning_position_list <= 0 then break - end + until do_mob_algorithm == false --this is a safety catch + end - local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)] - - --Prevent strange behavior/too close to player - if not spawning_position or vector_distance(player_pos, spawning_position) < 15 then - break - end - - local gotten_node = get_node(spawning_position).name - - if not gotten_node or gotten_node == "air" then --skip air nodes - break - end - - local gotten_biome = minetest.get_biome_data(spawning_position) - - if not gotten_biome then - break --skip if in unloaded area - end - - gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with - - --grab random mob - local mob_def = spawn_dictionary[math.random(1,#spawn_dictionary)] - - if not mob_def then - break --skip if something ridiculous happens (nil mob def) - end - - --skip if not correct dimension - if mob_def.dimension ~= dimension then - break - end - - --skip if not in correct biome - if not biome_check(mob_def.biomes, gotten_biome) then - break - end - - --add this so mobs don't spawn inside nodes - spawning_position.y = spawning_position.y + 1 - - if spawning_position.y < mob_def.min_height or spawning_position.y > mob_def.max_height then - break - end - - --only need to poll for node light if everything else worked - local gotten_light = get_node_light(spawning_position) - - --don't spawn if not in light limits - if gotten_light < mob_def.min_light or gotten_light > mob_def.max_light then - break - end - - local is_water = get_item_group(gotten_node, "water") ~= 0 - local is_lava = get_item_group(gotten_node, "lava") ~= 0 - - if mob_def.type_of_spawning == "ground" and is_water then - break - end - - if mob_def.type_of_spawning == "ground" and is_lava then - break - end - - --finally do the heavy check (for now) of mobs in area - if count_mobs(spawning_position, mob_def.spawn_class) >= mob_def.aoc then - break - end - - --adjust the position for water and lava mobs - if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then - spawning_position.y = spawning_position.y - 1 - end - - --everything is correct, spawn mob - minetest.add_entity(spawning_position, mob_def.name) - until true --this is a safety catch - end + break + until do_mob_spawning == false --this is a performance catch end end end) From edb1939649c62a2b486e1c04c5af27458f978388 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 00:27:35 -0400 Subject: [PATCH 145/176] Fix mob_counter in mob spawning limiter --- mods/ENTITIES/mcl_mobs/api/spawning.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index 412fbfc24f..fa900ab00d 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -10,6 +10,7 @@ local max = math.max local get_objects_inside_radius = minetest.get_objects_inside_radius local vector_distance = vector.distance local table_copy = table.copy +local table_remove = table.remove local math_random = math.random -- range for mob count @@ -162,7 +163,7 @@ local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false local count_mobs = function(pos) local num = 0 for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do - if object and object:get_luaentity() and object.name and object._cmi_is_mob then + if object and object:get_luaentity() and object:get_luaentity()._cmi_is_mob then num = num + 1 end end @@ -569,8 +570,8 @@ if mobs_spawn then break end - --hard code mob limit in area to 10 for now - if count_mobs(spawning_position) >= 10 then + --hard code mob limit in area to 5 for now + if count_mobs(spawning_position) >= 5 then break end @@ -657,7 +658,7 @@ if mobs_spawn then break else --print("deleting temp index") - table.remove(mob_library_worker_table, temp_index) + table_remove(mob_library_worker_table, temp_index) end until repeat_mob_search == false --this is needed to sort through mobs randomly From 2cef9e7cca2e70e544eb3068a0e3e36487cab669 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 00:39:32 -0400 Subject: [PATCH 146/176] Optimize mob spawning even further with additional lua locals --- mods/ENTITIES/mcl_mobs/api/spawning.lua | 36 ++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index fa900ab00d..9dd9d150f0 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -1,17 +1,23 @@ --lua locals -local get_node = minetest.get_node -local get_item_group = minetest.get_item_group -local get_node_light = minetest.get_node_light +local get_node = minetest.get_node +local get_item_group = minetest.get_item_group +local get_node_light = minetest.get_node_light local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air -local new_vector = vector.new +local get_biome_name = minetest.get_biome_name +local get_objects_inside_radius = minetest.get_objects_inside_radius + + local math_random = math.random -local get_biome_name = minetest.get_biome_name +local math_floor = math.floor local max = math.max -local get_objects_inside_radius = minetest.get_objects_inside_radius + local vector_distance = vector.distance +local vector_new = vector.new +local vector_floor = vector.floor + local table_copy = table.copy local table_remove = table.remove -local math_random = math.random + -- range for mob count local aoc_range = 32 @@ -481,18 +487,18 @@ local outer = 64 local int = {-1,1} local position_calculation = function(pos) - pos = vector.floor(pos) + pos = vector_floor(pos) --this is used to determine the axis buffer from the player - axis = math.random(0,1) + axis = math_random(0,1) --cast towards the direction if axis == 0 then --x - pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)] - pos.z = pos.z + math.random(-outer,outer) + pos.x = pos.x + math_random(inner,outer)*int[math_random(1,2)] + pos.z = pos.z + math_random(-outer,outer) else --z - pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)] - pos.x = pos.x + math.random(-outer,outer) + pos.z = pos.z + math_random(inner,outer)*int[math_random(1,2)] + pos.x = pos.x + math_random(-outer,outer) end return(pos) end @@ -508,7 +514,7 @@ local decypher_limits_dictionary = { local function decypher_limits(posy) --local min_max_table = decypher_limits_dictionary[dimension] --return min_max_table[1],min_max_table[2] - posy = math.floor(posy) + posy = math_floor(posy) return posy - 32, posy + 32 end @@ -556,7 +562,7 @@ if mobs_spawn then local goal_pos = position_calculation(player_pos) - local spawning_position_list = find_nodes_in_area_under_air(new_vector(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) + local spawning_position_list = find_nodes_in_area_under_air(vector_new(goal_pos.x,min,goal_pos.z), vector_new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) --couldn't find node if #spawning_position_list <= 0 then From 87dc41a125fa0de5508c7aafea3059e67766f3fa Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 22 Apr 2021 13:19:26 +0200 Subject: [PATCH 147/176] Fix crash when trying to explode an unknown node --- mods/CORE/mcl_explosions/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/CORE/mcl_explosions/init.lua b/mods/CORE/mcl_explosions/init.lua index 34375248e8..cd16aa879d 100644 --- a/mods/CORE/mcl_explosions/init.lua +++ b/mods/CORE/mcl_explosions/init.lua @@ -212,7 +212,7 @@ local function trace_explode(pos, strength, raydirs, radius, info, puncher) npos_x - emin_x + 1 local cid = data[idx] - local br = node_blastres[cid] + local br = node_blastres[cid] or INDESTRUCT_BLASTRES if br < INDESTRUCT_BLASTRES and br > max_blast_resistance then br = max_blast_resistance end From acbdc937b42b1870d5322567a92172db7341db7f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 22 Apr 2021 13:19:26 +0200 Subject: [PATCH 148/176] Fix crash when trying to explode an unknown node --- mods/CORE/mcl_explosions/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/CORE/mcl_explosions/init.lua b/mods/CORE/mcl_explosions/init.lua index 34375248e8..cd16aa879d 100644 --- a/mods/CORE/mcl_explosions/init.lua +++ b/mods/CORE/mcl_explosions/init.lua @@ -212,7 +212,7 @@ local function trace_explode(pos, strength, raydirs, radius, info, puncher) npos_x - emin_x + 1 local cid = data[idx] - local br = node_blastres[cid] + local br = node_blastres[cid] or INDESTRUCT_BLASTRES if br < INDESTRUCT_BLASTRES and br > max_blast_resistance then br = max_blast_resistance end From 951a24c684a104c89c493bdff860cd703e7ab784 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 22 Apr 2021 13:22:20 +0200 Subject: [PATCH 149/176] Fix #1590 (Bed drops itself when gets exploded) --- mods/ITEMS/mcl_beds/functions.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 86f6a68523..f3824a6f3c 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -301,7 +301,11 @@ function mcl_beds.on_rightclick(pos, player, is_top) local dim = mcl_worlds.pos_to_dimension(pos) if dim == "nether" or dim == "end" then -- Bed goes BOOM in the Nether or End. + local node = minetest.get_node(pos) + local dir = minetest.facedir_to_dir(node.param2) + minetest.remove_node(pos) + minetest.remove_node(string.sub(node.name, -4) == "_top" and vector.subtract(pos, dir) or vector.add(pos, dir)) if explosions_mod then mcl_explosions.explode(pos, 5, {drop_chance = 1.0, fire = true}) end From 8b23388d63ed377eabb93ac50a4c94ec3d3d8921 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 22 Apr 2021 13:22:20 +0200 Subject: [PATCH 150/176] Fix #1590 (Bed drops itself when gets exploded) --- mods/ITEMS/mcl_beds/functions.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 86f6a68523..f3824a6f3c 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -301,7 +301,11 @@ function mcl_beds.on_rightclick(pos, player, is_top) local dim = mcl_worlds.pos_to_dimension(pos) if dim == "nether" or dim == "end" then -- Bed goes BOOM in the Nether or End. + local node = minetest.get_node(pos) + local dir = minetest.facedir_to_dir(node.param2) + minetest.remove_node(pos) + minetest.remove_node(string.sub(node.name, -4) == "_top" and vector.subtract(pos, dir) or vector.add(pos, dir)) if explosions_mod then mcl_explosions.explode(pos, 5, {drop_chance = 1.0, fire = true}) end From 62adbb96258da7ef49871996585dfff50e491730 Mon Sep 17 00:00:00 2001 From: epCode Date: Thu, 22 Apr 2021 10:39:21 -0700 Subject: [PATCH 151/176] Fix #1587 --- .../models/3d_armor_entity.obj | 488 ++++++++++++++---- 1 file changed, 377 insertions(+), 111 deletions(-) diff --git a/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj b/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj index 052f692553..37bc521e98 100644 --- a/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj +++ b/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj @@ -1,79 +1,132 @@ -# Blender v2.73 (sub 0) OBJ File: '3d_armor_entity_3.blend' +# Blender v2.92.0 OBJ File: '' # www.blender.org mtllib 3d_armor_entity.mtl +o Cube +v 1.000000 1.000000 -1.000000 +v 1.000000 -1.000000 -1.000000 +v 1.000000 1.000000 1.000000 +v 1.000000 -1.000000 1.000000 +v -1.000000 1.000000 -1.000000 +v -1.000000 -1.000000 -1.000000 +v -1.000000 1.000000 1.000000 +v -1.000000 -1.000000 1.000000 +vt 0.625000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.750000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.125000 0.500000 +vt 0.375000 0.500000 +vt 0.125000 0.750000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +usemtl Material +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/4/2 7/6/2 8/7/2 +f 8/8/3 7/9/3 5/10/3 6/11/3 +f 6/12/4 2/13/4 4/5/4 8/14/4 +f 2/13/5 1/1/5 3/4/5 4/5/5 +f 6/11/6 5/10/6 1/1/6 2/13/6 o Player_Cube -v 2.200000 9.763893 1.200000 -v 2.200000 9.763893 -1.200000 +v 2.200000 9.763893 1.200001 v 2.200000 2.663871 1.200000 v 2.200000 2.663871 -1.200000 +v 2.200000 9.763893 -1.200000 v -2.200000 9.763893 -1.200000 -v -2.200000 9.763893 1.200000 -v -2.200000 2.663871 -1.200000 +v -2.200000 9.763893 1.200001 v -2.200000 2.663871 1.200000 -v 2.300000 13.863962 2.300000 -v 2.300000 13.863962 -2.300000 +v -2.200000 2.663871 -1.200000 +v 2.300000 13.863962 2.300001 v 2.300000 9.263885 2.300000 -v 2.300000 9.263885 -2.300000 -v -2.300000 13.863962 -2.300000 -v -2.300000 13.863962 2.300000 -v -2.300000 9.263885 -2.300000 +v 2.300000 9.263885 -2.299999 +v 2.300000 13.863962 -2.299999 +v -2.300000 13.863962 -2.299999 +v -2.300000 13.863962 2.300001 v -2.300000 9.263885 2.300000 +v -2.300000 9.263885 -2.299999 v -2.322686 2.473175 -1.300000 v -2.322686 2.473175 1.300000 v -4.713554 2.682348 1.300000 v -4.713554 2.682348 -1.300000 -v -1.686446 9.745432 -1.300000 -v -1.686446 9.745432 1.300000 +v -4.077313 9.954605 -1.299999 v -4.077313 9.954605 1.300000 -v -4.077313 9.954605 -1.300000 -v 4.077313 9.954605 -1.300000 -v 4.077313 9.954605 1.300000 +v -1.686446 9.745432 1.300000 +v -1.686446 9.745432 -1.299999 v 1.686446 9.745432 1.300000 -v 1.686446 9.745432 -1.300000 -v 4.713554 2.682348 -1.300000 -v 4.713554 2.682348 1.300000 v 2.322686 2.473175 1.300000 +v 4.713554 2.682348 1.300000 +v 4.077313 9.954605 1.300000 +v 1.686446 9.745432 -1.299999 v 2.322686 2.473175 -1.300000 +v 4.077313 9.954605 -1.299999 +v 4.713554 2.682348 -1.300000 +v 2.538733 2.980834 -1.210000 v 0.139099 2.938947 -1.200000 v 0.139099 2.938947 1.200000 -v 0.261266 -4.059988 1.200000 -v 0.261266 -4.059988 -1.200000 -v 2.660901 -4.018101 1.190000 -v 2.660901 -4.018101 -1.210000 v 2.538733 2.980834 1.190000 -v 2.538733 2.980834 -1.210000 -v -0.139099 2.938947 -1.200000 -v -0.139099 2.938947 1.200000 -v -0.261266 -4.059988 1.200000 -v -0.261266 -4.059988 -1.200000 +v 0.261266 -4.059988 -1.200000 +v 2.660901 -4.018101 -1.210000 +v 2.660901 -4.018101 1.190000 +v 0.261266 -4.059988 1.200000 v -2.538734 2.980834 -1.210000 v -2.538734 2.980834 1.190000 +v -0.139099 2.938947 1.200000 +v -0.139099 2.938947 -1.200000 +v -0.261266 -4.059988 1.200000 +v -0.261266 -4.059988 -1.200000 v -2.660901 -4.018101 -1.210000 v -2.660901 -4.018101 1.190000 +v 0.000000 -4.387500 -1.400000 +v 0.000000 -4.387500 1.400000 v -2.799999 -4.387500 1.390000 v -2.799999 -4.387500 -1.410000 v -2.800000 -0.812499 1.390000 v -2.800000 -0.812499 -1.410000 -v -0.000000 -4.387500 -1.400000 -v -0.000000 -4.387500 1.400000 -v -0.000000 -0.812499 1.400000 -v -0.000000 -0.812499 -1.400000 -v 2.800000 -0.812499 -1.410000 -v 2.800000 -0.812499 1.390000 -v 2.799999 -4.387500 -1.410000 -v 2.799999 -4.387500 1.390000 +v 0.000000 -0.812499 1.400000 +v 0.000000 -0.812499 -1.400000 +v 0.000000 -0.812499 -1.400000 v 0.000000 -4.387500 -1.400000 v 0.000000 -4.387500 1.400000 v 0.000000 -0.812499 1.400000 -v 0.000000 -0.812499 -1.400000 -v 2.267006 13.830965 2.267006 -v 2.267006 13.830965 -2.267006 +v 2.800000 -0.812499 -1.410000 +v 2.799999 -4.387500 -1.410000 +v 2.799999 -4.387500 1.390000 +v 2.800000 -0.812499 1.390000 +v 2.267006 13.830965 2.267007 +v 2.267006 13.830965 -2.267005 +v 2.267006 9.296881 -2.267005 v 2.267006 9.296881 2.267006 -v 2.267006 9.296881 -2.267006 -v -2.267006 13.830965 -2.267006 -v -2.267006 13.830965 2.267006 -v -2.267006 9.296881 -2.267006 +v -2.267006 13.830965 -2.267005 +v -2.267006 13.830965 2.267007 +v -2.267006 9.296881 -2.267005 v -2.267006 9.296881 2.267006 +v -4.168111 10.060661 1.681621 +v 1.741822 -5.305762 4.169018 +v 1.718504 -5.438008 3.407457 +v -6.641035 -3.963995 3.407457 +v 4.191429 8.586647 1.681621 +v -6.617718 -3.831752 4.169018 +v 4.168111 8.454401 0.920061 +v -4.191429 9.928415 0.920061 +v -4.191429 8.586648 1.681620 +v 6.617716 -3.831752 4.169018 +v 6.641035 -3.963997 3.407457 +v -1.718504 -5.438006 3.407457 +v 4.168111 10.060658 1.681621 +v -1.741822 -5.305762 4.169018 +v 4.191429 9.928414 0.920061 +v -4.168111 8.454404 0.920061 vt 0.250000 0.375000 vt 0.250000 0.000000 vt 0.312500 0.000000 @@ -81,6 +134,8 @@ vt 0.312500 0.375000 vt 0.437500 0.375000 vt 0.437500 0.500000 vt 0.312500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.375000 vt 0.562500 0.375000 vt 0.562500 0.500000 vt 0.437500 0.000000 @@ -97,97 +152,308 @@ vt 0.750000 1.000000 vt 0.625000 1.000000 vt 0.875000 0.750000 vt 0.875000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.750000 vt 0.750000 0.500000 +vt 0.875000 0.750000 vt 0.875000 0.500000 vt 1.000000 0.750000 vt 1.000000 0.500000 vt 0.750000 0.375000 +vt 0.750000 0.500000 vt 0.812500 0.500000 vt 0.812500 0.375000 vt 0.687500 0.375000 vt 0.687500 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.375000 +vt 0.687500 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.000000 vt 0.687500 0.000000 vt 0.750000 0.000000 +vt 0.687500 0.000000 +vt 0.812500 0.375000 vt 0.812500 0.000000 vt 0.875000 0.375000 vt 0.875000 0.000000 +vt 0.812500 0.375000 +vt 0.812500 0.000000 +vt 0.875000 0.000000 +vt 0.875000 0.375000 +vt 0.750000 0.375000 +vt 0.750000 0.000000 +vt 0.687500 0.375000 +vt 0.687500 0.000000 +vt 0.687500 0.375000 +vt 0.687500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.375000 +vt 0.750000 0.500000 +vt 0.687500 0.500000 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.500000 +vt 0.750000 0.500000 vt 0.125000 0.375000 vt 0.062500 0.375000 vt 0.062500 0.500000 vt 0.125000 0.500000 vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.125000 0.500000 vt 0.187500 0.500000 vt 0.000000 0.375000 vt 0.000000 0.000000 vt 0.062500 0.000000 +vt 0.062500 0.375000 +vt 0.250000 0.375000 +vt 0.250000 0.000000 +vt 0.187500 0.000000 +vt 0.187500 0.375000 +vt 0.125000 0.000000 +vt 0.062500 0.000000 +vt 0.187500 0.375000 vt 0.187500 0.000000 vt 0.125000 0.000000 -vt 0.437500 0.875000 -vt 0.437500 1.000000 -vt 0.375000 1.000000 -vt 0.375000 0.875000 -vt 0.250000 0.875000 -vt 0.312500 0.875000 -vt 0.312500 0.656250 -vt 0.250000 0.656250 -vt 0.500000 0.875000 -vt 0.437500 0.656250 -vt 0.500000 0.656250 -vt 0.375000 0.656250 -vt 0.312500 1.000000 -usemtl Armor +vt 0.125000 0.375000 +vt 0.125000 0.375000 +vt 0.125000 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.125000 0.000000 +vt 0.187500 0.000000 +vt 0.062500 0.000000 +vt 0.125000 0.000000 +vt 0.250000 0.375000 +vt 0.187500 0.375000 +vt 0.187500 0.000000 +vt 0.250000 0.000000 +vt 0.000000 0.375000 +vt 0.062500 0.375000 +vt 0.062500 0.000000 +vt 0.000000 0.000000 +vt 0.187500 0.375000 +vt 0.187500 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.375000 +vt 0.381250 0.832812 +vt 0.381250 0.845312 +vt 0.375000 0.845312 +vt 0.375000 0.832812 +vt 0.362500 0.832812 +vt 0.368750 0.832812 +vt 0.368750 0.810938 +vt 0.362500 0.810938 +vt 0.387500 0.832812 +vt 0.381250 0.832812 +vt 0.381250 0.810938 +vt 0.387500 0.810938 +vt 0.375000 0.832812 +vt 0.368750 0.832812 +vt 0.368750 0.810938 +vt 0.375000 0.810938 +vt 0.381250 0.832812 +vt 0.375000 0.832812 +vt 0.375000 0.810938 +vt 0.381250 0.810938 +vt 0.375000 0.845312 +vt 0.368750 0.845312 +vt 0.381250 0.832812 +vt 0.381250 0.810938 +vt 0.375000 0.810938 +vt 0.375000 0.832812 +vt 0.375000 0.832812 +vt 0.375000 0.810938 +vt 0.368750 0.810938 +vt 0.368750 0.832812 +vt 0.387500 0.832812 +vt 0.387500 0.810938 +vt 0.381250 0.810938 +vt 0.381250 0.832812 +vt 0.362500 0.832812 +vt 0.362500 0.810938 +vt 0.368750 0.810938 +vt 0.368750 0.832812 +vt 0.381250 0.832812 +vt 0.375000 0.832812 +vt 0.375000 0.845312 +vt 0.381250 0.845312 +vt 0.368750 0.845312 +vt 0.375000 0.845312 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.500000 +vt 0.500000 0.500000 +vt 0.750000 0.750000 +vt 0.625000 1.000000 +vt 0.750000 1.000000 +vt 0.875000 0.750000 +vt 0.750000 0.750000 +vt 0.750000 1.000000 +vt 0.875000 1.000000 +vt 0.750000 0.500000 +vt 0.875000 0.750000 +vt 0.875000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 0.500000 +vt 0.032859 0.558649 +vt 0.032859 0.998468 +vt 0.362724 0.998468 +vt 0.362724 0.558649 +vt 0.032859 0.558649 +vt 0.362724 0.558649 +vt 0.362724 0.998468 +vt 0.032859 0.998468 +vt 0.039157 0.992309 +vt 0.039157 0.656118 +vt 0.060169 0.656118 +vt 0.060169 0.992309 +vt -0.003415 0.501261 +vt 0.368238 0.501261 +vt 0.368238 0.563203 +vt -0.003415 0.563203 +vt 0.368238 0.996797 +vt -0.003415 0.996797 +vt -0.003415 0.934855 +vt 0.368238 0.934855 +vt 0.394691 0.498800 +vt 0.394691 0.994336 +vt 0.363720 0.994336 +vt 0.363720 0.498800 +vt 0.032859 0.998468 +vt 0.032859 0.558649 +vt 0.362724 0.558649 +vt 0.362724 0.998468 +vt 0.032859 0.998468 +vt 0.362724 0.998468 +vt 0.362724 0.558649 +vt 0.032859 0.558649 +vt 0.039157 0.656118 +vt 0.039157 0.992309 +vt 0.060169 0.992309 +vt 0.060169 0.656118 +vt -0.003415 0.996797 +vt 0.368238 0.996797 +vt 0.368238 0.934855 +vt -0.003415 0.934855 +vt 0.368238 0.501261 +vt -0.003415 0.501261 +vt -0.003415 0.563203 +vt 0.368238 0.563203 +vt 0.394691 0.994336 +vt 0.394691 0.498800 +vt 0.363720 0.498800 +vt 0.363720 0.994336 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +vn -0.0872 -0.9962 0.0000 +vn 0.0872 0.9962 0.0000 +vn -0.9962 0.0872 0.0000 +vn 0.9962 -0.0872 0.0000 +vn -0.9962 -0.0872 0.0000 +vn 0.9962 0.0872 0.0000 +vn -0.0872 0.9962 0.0000 +vn 0.0872 -0.9962 0.0000 +vn -0.0175 0.9998 0.0000 +vn 0.0175 -0.9998 0.0000 +vn 0.9998 0.0175 0.0000 +vn 0.0042 0.0001 1.0000 +vn -0.0042 -0.0001 -1.0000 +vn -0.9998 -0.0175 0.0000 +vn 0.0175 0.9998 0.0000 +vn 0.9998 -0.0175 0.0000 +vn 0.0042 -0.0001 -1.0000 +vn -0.0042 0.0001 1.0000 +vn -0.9998 0.0175 0.0000 +vn -0.0175 -0.9998 0.0000 +vn -0.0036 -0.0000 1.0000 +vn 0.0036 0.0000 -1.0000 +vn -0.0036 0.0000 -1.0000 +vn 0.0036 -0.0000 1.0000 +vn 0.0302 0.1710 0.9848 +vn -0.0302 -0.1710 -0.9848 +vn 0.1710 0.9698 -0.1737 +vn 0.9848 -0.1736 0.0000 +vn -0.9848 0.1736 -0.0000 +vn -0.1710 -0.9698 0.1736 +vn -0.0302 0.1710 0.9848 +vn 0.0302 -0.1710 -0.9848 +vn -0.1710 0.9698 -0.1736 +vn 0.9848 0.1736 0.0000 +vn -0.9848 -0.1736 -0.0000 +vn 0.1710 -0.9698 0.1736 +usemtl None s off -f 1/1 3/2 4/3 2/4 -f 5/5 6/6 1/7 2/4 -f 8/6 7/5 4/8 3/9 -f 5/5 2/4 4/3 7/10 -f 7/10 8/11 6/12 5/5 -f 8/11 3/13 1/14 6/12 -f 9/15 11/16 12/17 10/18 -f 13/19 14/20 9/21 10/18 -f 12/22 11/23 16/20 15/19 -f 13/19 10/18 12/17 15/24 -f 14/22 13/19 15/24 16/25 -f 9/26 14/22 16/25 11/27 -f 17/28 18/24 19/29 20/30 -f 24/31 23/32 22/24 21/28 -f 23/31 24/14 20/13 19/33 -f 24/31 21/28 17/34 20/33 -f 21/28 22/30 18/35 17/34 -f 22/30 23/36 19/37 18/35 -f 27/30 31/35 30/37 26/36 -f 28/28 32/34 31/35 27/30 -f 25/31 29/33 32/34 28/28 -f 26/31 30/33 29/13 25/14 -f 25/31 28/28 27/24 26/32 -f 32/28 29/30 30/29 31/24 -f 40/38 33/39 34/40 39/41 -f 36/42 38/38 37/41 35/43 -f 39/44 37/45 38/46 40/39 -f 34/1 35/2 37/47 39/42 -f 40/38 38/48 36/46 33/39 -f 33/42 36/47 35/48 34/38 -f 45/38 46/41 42/40 41/39 -f 41/42 42/38 43/48 44/47 -f 45/38 41/39 44/46 47/48 -f 42/1 46/42 48/47 43/2 -f 46/44 45/39 47/46 48/45 -f 44/42 43/43 48/41 47/38 -f 53/49 54/50 49/51 50/52 -f 51/53 52/54 50/55 49/56 -f 55/57 51/49 49/58 54/59 -f 52/52 56/54 53/55 50/60 -f 56/49 55/52 54/60 53/58 -f 52/52 51/51 55/61 56/54 -f 64/49 61/58 62/60 63/52 -f 57/52 59/60 61/55 64/54 -f 63/57 62/59 60/58 58/49 -f 58/53 60/56 59/55 57/54 -f 61/49 59/52 60/51 62/50 -f 57/52 64/54 63/61 58/51 -f 65/15 66/18 68/17 67/16 -f 69/19 66/18 65/21 70/20 -f 68/22 71/19 72/20 67/23 -f 69/19 71/24 68/17 66/18 -f 70/22 72/25 71/24 69/19 -f 65/26 67/27 72/25 70/22 +f 9/15/7 10/16/7 11/17/7 12/18/7 +f 13/19/8 14/20/8 9/21/8 12/18/8 +f 15/22/9 16/23/9 11/24/9 10/25/9 +f 13/19/10 12/18/10 11/17/10 16/26/10 +f 16/26/11 15/27/11 14/28/11 13/19/11 +f 15/27/12 10/29/12 9/30/12 14/28/12 +f 17/31/7 18/32/7 19/33/7 20/34/7 +f 21/35/8 22/36/8 17/37/8 20/34/8 +f 19/38/9 18/39/9 23/40/9 24/41/9 +f 21/35/10 20/34/10 19/33/10 24/42/10 +f 22/43/11 21/35/11 24/42/11 23/44/11 +f 17/45/12 22/43/12 23/44/12 18/46/12 +f 25/47/13 26/48/13 27/49/13 28/50/13 +f 29/51/14 30/52/14 31/53/14 32/54/14 +f 30/55/15 29/56/15 28/57/15 27/58/15 +f 29/51/10 32/54/10 25/59/10 28/60/10 +f 32/54/16 31/61/16 26/62/16 25/59/16 +f 31/61/12 30/63/12 27/64/12 26/62/12 +f 33/65/12 34/66/12 35/67/12 36/68/12 +f 37/69/17 38/70/17 34/66/17 33/65/17 +f 39/71/10 40/72/10 38/70/10 37/69/10 +f 36/73/18 35/74/18 40/75/18 39/76/18 +f 39/71/19 37/69/19 33/77/19 36/78/19 +f 38/79/20 40/80/20 35/81/20 34/82/20 +f 41/83/21 42/84/21 43/85/21 44/86/21 +f 45/87/22 46/88/22 47/89/22 48/90/22 +f 44/91/23 47/92/23 46/93/23 41/94/23 +f 43/95/24 48/96/24 47/97/24 44/98/24 +f 41/83/25 46/99/25 45/100/25 42/84/25 +f 42/101/26 45/102/26 48/103/26 43/104/26 +f 49/105/27 50/106/27 51/107/27 52/108/27 +f 52/109/28 51/110/28 53/111/28 54/112/28 +f 49/105/29 52/108/29 54/113/29 55/114/29 +f 51/115/30 50/116/30 56/117/30 53/118/30 +f 50/119/31 49/120/31 55/121/31 56/122/31 +f 54/123/32 53/124/32 56/125/32 55/126/32 +f 57/127/9 58/128/9 59/129/9 60/130/9 +f 61/131/11 62/132/11 60/133/11 59/134/11 +f 63/135/33 61/136/33 59/137/33 58/138/33 +f 62/139/34 64/140/34 57/141/34 60/142/34 +f 64/143/7 63/144/7 58/145/7 57/146/7 +f 62/139/8 61/147/8 63/148/8 64/140/8 +f 65/149/11 66/150/11 67/151/11 68/152/11 +f 69/153/35 70/154/35 66/155/35 65/156/35 +f 68/157/36 67/158/36 71/159/36 72/160/36 +f 72/161/7 71/162/7 70/163/7 69/164/7 +f 66/165/9 70/166/9 71/167/9 67/168/9 +f 69/153/8 65/156/8 68/169/8 72/170/8 +f 73/171/11 74/172/11 75/173/11 76/174/11 +f 77/175/9 74/172/9 73/176/9 78/177/9 +f 75/178/8 79/179/8 80/180/8 76/181/8 +f 77/175/12 79/182/12 75/173/12 74/172/12 +f 78/183/7 80/184/7 79/182/7 77/175/7 +f 73/185/10 76/186/10 80/184/10 78/183/10 +f 85/187/37 81/188/37 86/189/37 82/190/37 +f 87/191/38 83/192/38 84/193/38 88/194/38 +f 81/195/39 85/196/39 87/197/39 88/198/39 +f 85/199/40 82/200/40 83/201/40 87/202/40 +f 86/203/41 81/204/41 88/205/41 84/206/41 +f 82/207/42 86/208/42 84/209/42 83/210/42 +f 93/211/43 89/212/43 94/213/43 90/214/43 +f 95/215/44 91/216/44 92/217/44 96/218/44 +f 89/219/45 93/220/45 95/221/45 96/222/45 +f 93/223/46 90/224/46 91/225/46 95/226/46 +f 94/227/47 89/228/47 96/229/47 92/230/47 +f 90/231/48 94/232/48 92/233/48 91/234/48 From 0486c7c46839b65a147b5ab6134b11d9e91ebe59 Mon Sep 17 00:00:00 2001 From: kay27 Date: Thu, 22 Apr 2021 23:07:56 +0400 Subject: [PATCH 152/176] [mineclone5] fix sweeet berry depends --- mods/ITEMS/mcl_sweet_berry/mod.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_sweet_berry/mod.conf b/mods/ITEMS/mcl_sweet_berry/mod.conf index 0642018e97..026f1e260b 100644 --- a/mods/ITEMS/mcl_sweet_berry/mod.conf +++ b/mods/ITEMS/mcl_sweet_berry/mod.conf @@ -1,2 +1,2 @@ name=mcl_sweet_berry -depends=mcl_vars \ No newline at end of file +depends=mcl_init From c46c07f8361f2239b91cb81190e0c5493a04809d Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 22 Apr 2021 19:18:05 +0000 Subject: [PATCH 153/176] Makes fireworks rockets infinite in creative mode --- mods/ITEMS/mcl_fireworks/register.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_fireworks/register.lua b/mods/ITEMS/mcl_fireworks/register.lua index 08f07c5cbe..6ab55442ce 100644 --- a/mods/ITEMS/mcl_fireworks/register.lua +++ b/mods/ITEMS/mcl_fireworks/register.lua @@ -15,7 +15,9 @@ local function register_rocket(n, duration, force) local elytra = mcl_playerplus.elytra[user] if elytra.active and elytra.rocketing <= 0 then elytra.rocketing = duration - itemstack:take_item() + if not minetest.is_creative_enabled(user:get_player_name()) then + itemstack:take_item() + end minetest.sound_play("mcl_fireworks_rocket", {pos = user:get_pos()}) end return itemstack From ee905642c2cdfaa3be3eb5c2af7ec75599ffd41e Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 17:56:38 -0400 Subject: [PATCH 154/176] Add temporary warning debug to spawning algorithm output --- mods/ENTITIES/mcl_mobs/api/spawning.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index 9dd9d150f0..ed38ce25ea 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -659,10 +659,12 @@ if mobs_spawn then --found a mob, exit out of loop if not skip then + minetest.log("warning", "found mob:"..temp_def.name) --print("found mob:"..temp_def.name) mob_def = table_copy(temp_def) break else + minetest.log("warning", "deleting temp index "..temp_index) --print("deleting temp index") table_remove(mob_library_worker_table, temp_index) end From d0d128c1d8f84e8de590e34adfe0265556ccd3e1 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 18:18:57 -0400 Subject: [PATCH 155/176] Break infinite loop if unable to find any mob to spawn --- mods/ENTITIES/mcl_mobs/api/spawning.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index ed38ce25ea..fe8a56dfca 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -615,6 +615,12 @@ if mobs_spawn then local repeat_mob_search = true repeat + --do not infinite loop + if #mob_library_worker_table <= 0 then + --print("breaking infinite loop") + break + end + local skip = false --use this for removing table elements of mobs that do not match From 31a791c33b19d76350993d844747a0c51a77382c Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 18:20:58 -0400 Subject: [PATCH 156/176] Undo debug.txt spam from mob spawning --- mods/ENTITIES/mcl_mobs/api/spawning.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index fe8a56dfca..f885d55c7e 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -665,12 +665,12 @@ if mobs_spawn then --found a mob, exit out of loop if not skip then - minetest.log("warning", "found mob:"..temp_def.name) + --minetest.log("warning", "found mob:"..temp_def.name) --print("found mob:"..temp_def.name) mob_def = table_copy(temp_def) break else - minetest.log("warning", "deleting temp index "..temp_index) + --minetest.log("warning", "deleting temp index "..temp_index) --print("deleting temp index") table_remove(mob_library_worker_table, temp_index) end From 45790c0be0eec380e281a687a1ff03ea1f114143 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 19:12:02 -0400 Subject: [PATCH 157/176] Re-enable mob punching (broken) --- mods/ENTITIES/mcl_mobs/api/api.lua | 2 +- .../api/mob_functions/interaction.lua | 116 ++++-------------- 2 files changed, 26 insertions(+), 92 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index b2d5ba162f..facec57d3e 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -120,7 +120,7 @@ end -- creative check function mobs.is_creative(name) - return minetest.is_creative_enabled(name) + return minetest_is_creative_enabled(name) end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index 7cbcd9a706..8a22254936 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -1,4 +1,9 @@ +local minetest_after = minetest.after +local minetest_sound_play = minetest.sound_play + local math_floor = math.floor +local math_min = math.min + local vector_direction = vector.direction mobs.feed_tame = function(self) @@ -65,34 +70,24 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end - --[[ -- custom punch function if self.do_punch then - -- when false skip going any further if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then return end end + -- error checking when mod profiling is enabled if not tool_capabilities then - minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") + minetest.log("warning", "[mobs_mc] Mod profiling enabled, damage not enabled") return end + local is_player = hitter:is_player() - if is_player then - -- is mob protected? - if self.protected and minetest_is_protected(self.object:get_pos(), hitter:get_player_name()) then - return - end - - -- set/update 'drop xp' timestamp if hitted by player - self.xp_timestamp = minetest_get_us_time() - end - -- punch interval local weapon = hitter:get_wielded_item() @@ -108,28 +103,23 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) local armor = self.object:get_armor_groups() or {} local tmp - -- quick error check incase it ends up 0 (serialize.h check test) + -- quick error check in case it ends up 0 (serialize.h check test) if tflp == 0 then tflp = 0.2 end - if use_cmi then - damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) - else + for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do - for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do + tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) - tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) - - if tmp < 0 then - tmp = 0.0 - elseif tmp > 1 then - tmp = 1.0 - end - - damage = damage + (tool_capabilities.damage_groups[group] or 0) - * tmp * ((armor[group] or 0) / 100.0) + if tmp < 0 then + tmp = 0.0 + elseif tmp > 1 then + tmp = 1.0 end + + damage = damage + (tool_capabilities.damage_groups[group] or 0) + * tmp * ((armor[group] or 0) / 100.0) end if weapon then @@ -141,9 +131,7 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- check for tool immunity or special damage for n = 1, #self.immune_to do - if self.immune_to[n][1] == weapon:get_name() then - damage = self.immune_to[n][2] or 0 break end @@ -155,21 +143,14 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) return end - if use_cmi then - - local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) - - if cancel then return end - 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) - if minetest_is_creative_enabled("") ~= true - and tool_capabilities then + --minetest_is_creative_enabled("") ~= true removed for now + if tool_capabilities then if tool_capabilities.punch_attack_uses then -- Without this delay, the wear does not work. Quite hacky ... minetest_after(0, function(name) @@ -207,15 +188,15 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) }, true) end - damage_effect(self, damage) + --damage_effect(self, damage) -- do damage self.health = self.health - damage -- skip future functions if dead, except alerting others - if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then - die = true - end + --if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then + -- die = true + --end -- knock back effect (only on full punch) if not die @@ -266,6 +247,7 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end -- END if damage -- if skittish then run away + --[[ if not die and self.runaway == true and self.state ~= "flop" then local lp = hitter:get_pos() @@ -288,54 +270,6 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) self.following = nil end - local name = hitter:get_player_name() or "" - - -- attack puncher and call other mobs for help - if self.passive == false - and self.state ~= "flop" - and (self.child == false or self.type == "monster") - and hitter:get_player_name() ~= self.owner - and not mobs.invis[ name ] then - - if not die then - -- attack whoever punched mob - self.state = "" - do_attack(self, hitter) - end - - -- alert others to the attack - local objs = minetest_get_objects_inside_radius(hitter:get_pos(), self.view_range) - local obj = nil - - for n = 1, #objs do - - obj = objs[n]:get_luaentity() - - if obj then - - -- only alert members of same mob or friends - if obj.group_attack - and obj.state ~= "attack" - and obj.owner ~= name then - if obj.name == self.name then - do_attack(obj, hitter) - elseif type(obj.group_attack) == "table" then - for i=1, #obj.group_attack do - if obj.name == obj.group_attack[i] then - do_attack(obj, hitter) - break - end - end - end - end - - -- have owned mobs attack player threat - if obj.owner == name and obj.owner_loyal then - do_attack(obj, self.object) - end - end - end - end ]]-- end From f9a7144b658f747be895bb6a8b69c8a0124fdd2a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 20:07:30 -0400 Subject: [PATCH 158/176] Implement ability to hurt mobs --- .../mcl_mobs/api/mob_functions/ai.lua | 39 +++++++----- .../api/mob_functions/interaction.lua | 62 +++++++++++-------- 2 files changed, 59 insertions(+), 42 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 11c61f20f4..9626477f0a 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -650,23 +650,30 @@ mobs.mob_step = function(self, dtime) end end - - --jump only (like slimes) - if self.jump_only then - jump_state_switch(self, dtime) - jump_state_execution(self, dtime) - --swimming - elseif self.swim then - swim_state_switch(self, dtime) - swim_state_execution(self, dtime) - --flying - elseif self.fly then - fly_state_switch(self, dtime) - fly_state_execution(self,dtime) - --regular mobs that walk around + if self.pause_timer > 0 then + self.pause_timer = self.pause_timer - dtime + --don't break eye contact + if self.hostile and self.attacking then + mobs.set_yaw_while_attacking(self) + end else - land_state_switch(self, dtime) - land_state_execution(self,dtime) + --jump only (like slimes) + if self.jump_only then + jump_state_switch(self, dtime) + jump_state_execution(self, dtime) + --swimming + elseif self.swim then + swim_state_switch(self, dtime) + swim_state_execution(self, dtime) + --flying + elseif self.fly then + fly_state_switch(self, dtime) + fly_state_execution(self,dtime) + --regular mobs that walk around + else + land_state_switch(self, dtime) + land_state_execution(self,dtime) + end end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index 8a22254936..e9bcc895a5 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -1,10 +1,12 @@ local minetest_after = minetest.after local minetest_sound_play = minetest.sound_play -local math_floor = math.floor -local math_min = math.min +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 mobs.feed_tame = function(self) return nil @@ -149,8 +151,8 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- add weapon wear manually -- Required because we have custom health handling ("health" property) - --minetest_is_creative_enabled("") ~= true removed for now - if tool_capabilities then + --minetest_is_creative_enabled("") ~= true --removed for now + if tool_capabilities then if tool_capabilities.punch_attack_uses then -- Without this delay, the wear does not work. Quite hacky ... minetest_after(0, function(name) @@ -199,33 +201,39 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) --end -- knock back effect (only on full punch) - if not die - and self.knock_back - and tflp >= punch_interval then + if tflp >= punch_interval then - local v = self.object:get_velocity() - local r = 1.4 - math_min(punch_interval, 1.4) - local kb = r * 2.0 - local up = 2 + local velocity = self.object:get_velocity() + + --2d direction + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = hitter:get_pos() + pos2.y = 0 + + local dir = vector.direction(pos2,pos1) + + local up = 3 -- if already in air then dont go up anymore when hit - if v.y ~= 0 - or self.fly then + if velocity.y ~= 0 then up = 0 end - -- direction error check - dir = dir or {x = 0, y = 0, z = 0} + + --0.75 for perfect distance to not be too easy, and not be too hard + local multiplier = 0.75 -- check if tool already has specific knockback value - if tool_capabilities.damage_groups["knockback"] then - kb = tool_capabilities.damage_groups["knockback"] - else - kb = kb * 1.5 + local knockback_enchant = mcl_enchanting.get_enchantment(hitter:get_wielded_item(), "knockback") + if knockback_enchant and knockback_enchant > 0 then + multiplier = knockback_enchant + 1 --(starts from 1, 1 would be no change) end - + local luaentity + + --[[ --why does this multiply it again??? if hitter then luaentity = hitter:get_luaentity() end @@ -235,14 +243,16 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) elseif luaentity and luaentity._knockback then kb = kb + luaentity._knockback end + ]]-- - self.object:set_velocity({ - x = dir.x * kb, - y = dir.y * kb + up * 2, - z = dir.z * kb - }) + dir = vector_multiply(dir,multiplier) - self.pause_timer = 0.25 + dir.y = up + + --add velocity breaks momentum - use set velocity + self.object:set_velocity(dir) + + self.pause_timer = 0.4 end end -- END if damage From 991bba0a1d611cf545020c9129fdcbc4806e73c6 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 20:10:01 -0400 Subject: [PATCH 159/176] Add comments into ai.lua --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 9626477f0a..a8894898cf 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -612,11 +612,12 @@ mobs.mob_step = function(self, dtime) local attacking = nil + --scan for players within eyesight if self.hostile then --true for line_of_sight is debug attacking = mobs.detect_closest_player_within_radius(self,true,self.view_range,self.eye_height) - --go get the closest player ROAR >:O + --go get the closest player if attacking then --set initial punch timer @@ -650,12 +651,14 @@ mobs.mob_step = function(self, dtime) end end + --mob is stunned after being hit if self.pause_timer > 0 then self.pause_timer = self.pause_timer - dtime --don't break eye contact if self.hostile and self.attacking then mobs.set_yaw_while_attacking(self) end + --do normal ai else --jump only (like slimes) if self.jump_only then From e1812b2cdba132afec9ed6cdc45ee9f078806264 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 20:12:02 -0400 Subject: [PATCH 160/176] Reset pause timer to 0 --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index a8894898cf..12b87aef28 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -658,6 +658,11 @@ mobs.mob_step = function(self, dtime) if self.hostile and self.attacking then mobs.set_yaw_while_attacking(self) end + + --perfectly reset pause_timer + if self.pause_timer < 0 then + self.pause_timer = 0 + end --do normal ai else --jump only (like slimes) From 8530e6ee368f510581c618666613432f25266ce5 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 20:20:56 -0400 Subject: [PATCH 161/176] Make mob punching time based --- .../mcl_mobs/api/mob_functions/ai.lua | 2 - .../api/mob_functions/interaction.lua | 126 ++++++++---------- 2 files changed, 59 insertions(+), 69 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 12b87aef28..ad8e26a584 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -685,8 +685,6 @@ mobs.mob_step = function(self, dtime) end - - -- can mob be pushed, if so calculate direction -- do this last (overrides everything) if self.pushable then mobs.collision(self) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index e9bcc895a5..0d24d569ed 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -80,6 +80,12 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end end + --don't do damage until pause timer resets + if self.pause_timer > 0 then + print(self.pause_timer) + return + end + -- error checking when mod profiling is enabled if not tool_capabilities then @@ -93,6 +99,7 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- punch interval local weapon = hitter:get_wielded_item() + local punch_interval = 1.4 -- exhaust attacker @@ -105,23 +112,9 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) local armor = self.object:get_armor_groups() or {} local tmp - -- quick error check in case it ends up 0 (serialize.h check test) - if tflp == 0 then - tflp = 0.2 - end - + --calculate damage groups for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do - - tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) - - if tmp < 0 then - tmp = 0.0 - elseif tmp > 1 then - tmp = 1.0 - end - - damage = damage + (tool_capabilities.damage_groups[group] or 0) - * tmp * ((armor[group] or 0) / 100.0) + damage = damage + (tool_capabilities.damage_groups[group] or 0) * ((armor[group] or 0) / 100.0) end if weapon then @@ -200,61 +193,60 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- die = true --end - -- knock back effect (only on full punch) - if tflp >= punch_interval then + -- knock back effect + local velocity = self.object:get_velocity() + + --2d direction + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = hitter:get_pos() + pos2.y = 0 - local velocity = self.object:get_velocity() - - --2d direction - local pos1 = self.object:get_pos() - pos1.y = 0 - local pos2 = hitter:get_pos() - pos2.y = 0 + local dir = vector.direction(pos2,pos1) - local dir = vector.direction(pos2,pos1) + local up = 3 - local up = 3 - - -- if already in air then dont go up anymore when hit - if velocity.y ~= 0 then - up = 0 - end - - - --0.75 for perfect distance to not be too easy, and not be too hard - local multiplier = 0.75 - - -- check if tool already has specific knockback value - local knockback_enchant = mcl_enchanting.get_enchantment(hitter:get_wielded_item(), "knockback") - if knockback_enchant and knockback_enchant > 0 then - multiplier = knockback_enchant + 1 --(starts from 1, 1 would be no change) - end - - - local luaentity - - --[[ --why does this multiply it again??? - if hitter then - luaentity = hitter:get_luaentity() - end - if hitter and is_player then - local wielditem = hitter:get_wielded_item() - kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") - elseif luaentity and luaentity._knockback then - kb = kb + luaentity._knockback - end - ]]-- - - dir = vector_multiply(dir,multiplier) - - dir.y = up - - --add velocity breaks momentum - use set velocity - self.object:set_velocity(dir) - - self.pause_timer = 0.4 + -- if already in air then dont go up anymore when hit + if velocity.y ~= 0 then + up = 0 end - end -- END if damage + + + --0.75 for perfect distance to not be too easy, and not be too hard + local multiplier = 0.75 + + -- check if tool already has specific knockback value + local knockback_enchant = mcl_enchanting.get_enchantment(hitter:get_wielded_item(), "knockback") + if knockback_enchant and knockback_enchant > 0 then + multiplier = knockback_enchant + 1 --(starts from 1, 1 would be no change) + end + + + local luaentity + + --[[ --why does this multiply it again??? + if hitter then + luaentity = hitter:get_luaentity() + end + if hitter and is_player then + local wielditem = hitter:get_wielded_item() + kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") + elseif luaentity and luaentity._knockback then + kb = kb + luaentity._knockback + end + ]]-- + + dir = vector_multiply(dir,multiplier) + + dir.y = up + + --add velocity breaks momentum - use set velocity + self.object:set_velocity(dir) + + --0.4 seconds until you can hurt the mob again + self.pause_timer = 0.4 + end + -- END if damage -- if skittish then run away --[[ From b73ab976a1115044bc336f9e3f181ecf6e75cc06 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 20:25:58 -0400 Subject: [PATCH 162/176] Implement framework for mob death --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 5 +++++ .../mcl_mobs/api/mob_functions/interaction.lua | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index ad8e26a584..cf19f3ab30 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -610,6 +610,11 @@ mobs.mob_step = function(self, dtime) return false end + if self.health <= 0 then + print("I'm DEAD :(") + return + end + local attacking = nil --scan for players within eyesight diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index 0d24d569ed..32011aafe8 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -43,6 +43,10 @@ end -- I have no idea what this does mobs.create_mob_on_rightclick = function(on_rightclick) return function(self, clicker) + --don't allow rightclicking dead mobs + if self.health <= 0 then + return + end local stop = on_rightclick_prefix(self, clicker) if (not stop) and (on_rightclick) then on_rightclick(self, clicker) @@ -54,6 +58,11 @@ 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 + end + --neutral passive mobs switch to neutral hostile if self.neutral then @@ -82,7 +91,6 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) --don't do damage until pause timer resets if self.pause_timer > 0 then - print(self.pause_timer) return end From 3fe8d2d3c59ca6c173817a9d2d6b48e3549acd57 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 20:30:50 -0400 Subject: [PATCH 163/176] Add file death_logic.lua --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 4 +++- mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua | 0 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index facec57d3e..3e13dc8529 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -159,6 +159,7 @@ dofile(api_path .. "movement.lua") dofile(api_path .. "set_up.lua") dofile(api_path .. "attack_type_instructions.lua") dofile(api_path .. "sound_handling.lua") +dofile(api_path .. "death_logic.lua") mobs.spawning_mobs = {} diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index cf19f3ab30..313f3f3f96 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -611,7 +611,7 @@ mobs.mob_step = function(self, dtime) end if self.health <= 0 then - print("I'm DEAD :(") + return end @@ -668,6 +668,8 @@ mobs.mob_step = function(self, dtime) if self.pause_timer < 0 then self.pause_timer = 0 end + + return -- don't allow collision detection --do normal ai else --jump only (like slimes) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua new file mode 100644 index 0000000000..e69de29bb2 From ebf27866ca3bb02c726d4729c0666ee28e20a3dd Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 21:12:08 -0400 Subject: [PATCH 164/176] Fix typo and error in animation.lua --- mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index b7b8fa5748..00a33e9573 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -175,10 +175,9 @@ mobs.set_static_pitch = function(self) local current_rotation = self.object:get_rotation() current_rotation.x = 0 - current_rotation.z = 0 self.object:set_rotation(current_rotation) - self.pitch_switchfdas = "static" + self.pitch_switch = "static" end --this is a helper function for mobs explosion animation From 8142f7e51214672292d3bffe3fa8119eb8a1cf1c Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 21:36:42 -0400 Subject: [PATCH 165/176] Add in mob death --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + .../mcl_mobs/api/mob_functions/ai.lua | 16 +- .../api/mob_functions/backup_code_api.lua | 77 -------- .../api/mob_functions/death_logic.lua | 165 ++++++++++++++++++ 4 files changed, 181 insertions(+), 78 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 3e13dc8529..e5e9d32f48 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -327,6 +327,7 @@ function mobs:register_mob(name, def) visual_size_origin = def.visual_size or {x = 1, y = 1, z = 1}, punch_timer_cooloff = def.punch_timer_cooloff or 0.5, projectile_cooldown = def.projectile_cooldown or 2, + death_animation_timer = 0, --end j4i stuff -- MCL2 extensions diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index 313f3f3f96..3a0dda1171 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -610,8 +610,22 @@ mobs.mob_step = function(self, dtime) return false end + --do death logic (animation, poof, explosion, etc) if self.health <= 0 then - + + mobs.death_logic(self, dtime) + + --this is here because the mob must continue to move + --while stunned before coming to a complete halt even during + --the death tilt + if self.pause_timer > 0 then + self.pause_timer = self.pause_timer - dtime + --perfectly reset pause_timer + if self.pause_timer < 0 then + self.pause_timer = 0 + end + end + return end 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.lua index 802201688e..76a319d334 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua @@ -971,84 +971,7 @@ local update_tag = function(self) update_roll(self) end --- drop items -local item_drop = function(self, cooked, looting_level) - -- no drops if disabled by setting - if not mobs_drop_items then return end - - looting_level = looting_level or 0 - - -- no drops for child mobs (except monster) - if (self.child and self.type ~= "monster") then - return - end - - local obj, item, num - local pos = self.object:get_pos() - - self.drops = self.drops or {} -- nil check - - for n = 1, #self.drops do - local dropdef = self.drops[n] - local chance = 1 / dropdef.chance - local looting_type = dropdef.looting - - if looting_level > 0 then - local chance_function = dropdef.looting_chance_function - if chance_function then - chance = chance_function(looting_level) - elseif looting_type == "rare" then - chance = chance + (dropdef.looting_factor or 0.01) * looting_level - end - end - - local num = 0 - local do_common_looting = (looting_level > 0 and looting_type == "common") - if math_random() < chance then - num = math_random(dropdef.min or 1, dropdef.max or 1) - elseif not dropdef.looting_ignore_chance then - do_common_looting = false - end - - if do_common_looting then - num = num + math_floor(math_random(0, looting_level) + 0.5) - end - - if num > 0 then - item = dropdef.name - - -- cook items when true - if cooked then - - 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() - end - end - - -- add item if it exists - for x = 1, num do - obj = minetest_add_item(pos, ItemStack(item .. " " .. 1)) - end - - if obj and obj:get_luaentity() then - - obj:set_velocity({ - x = math_random(-10, 10) / 9, - y = 6, - z = math_random(-10, 10) / 9, - }) - elseif obj then - obj:remove() -- item does not exist - end - end - end - - self.drops = {} -end -- check if mob is dead or only hurt 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 e69de29bb2..53d517a584 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua @@ -0,0 +1,165 @@ +local minetest_add_item = minetest.add_item +local minetest_add_particlespawner = minetest.add_particlespawner +local minetest_sound_play = minetest.sound_play + +local math_pi = math.pi +local math_random = math.random +local math_floor = math.floor +local HALF_PI = math_pi / 2 + +local vector_new = vector.new + + +local death_effect = function(self) + + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() + local collisionbox = self.object:get_properties().collisionbox + + local min, max + + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + end + + minetest_add_particlespawner({ + amount = 50, + time = 0.001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-0.5,0.5,-0.5), + maxvel = vector.new(0.5,1,0.5), + minexptime = 1.1, + maxexptime = 1.5, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_mob_death.png", -- this particle looks strange + }) +end + + +-- drop items +local item_drop = function(self, cooked, looting_level) + + looting_level = looting_level or 0 + + -- no drops for child mobs (except monster) + if (self.child and self.type ~= "monster") then + return + end + + local obj, item, num + local pos = self.object:get_pos() + + self.drops = self.drops or {} -- nil check + + for n = 1, #self.drops do + local dropdef = self.drops[n] + local chance = 1 / dropdef.chance + local looting_type = dropdef.looting + + if looting_level > 0 then + local chance_function = dropdef.looting_chance_function + if chance_function then + chance = chance_function(looting_level) + elseif looting_type == "rare" then + chance = chance + (dropdef.looting_factor or 0.01) * looting_level + end + end + + local num = 0 + local do_common_looting = (looting_level > 0 and looting_type == "common") + if math_random() < chance then + num = math_random(dropdef.min or 1, dropdef.max or 1) + elseif not dropdef.looting_ignore_chance then + do_common_looting = false + end + + if do_common_looting then + num = num + math_floor(math_random(0, looting_level) + 0.5) + end + + if num > 0 then + item = dropdef.name + + -- cook items when true + if cooked then + + 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() + end + end + + -- add item if it exists + for x = 1, num do + obj = minetest_add_item(pos, ItemStack(item .. " " .. 1)) + end + + if obj and obj:get_luaentity() then + + obj:set_velocity({ + x = math_random(-10, 10) / 9, + y = 6, + z = math_random(-10, 10) / 9, + }) + elseif obj then + obj:remove() -- item does not exist + end + end + end + + self.drops = {} +end + + +mobs.death_logic = function(self, dtime) + self.death_animation_timer = self.death_animation_timer + dtime + + + --the final POOF of a mob despawning + if self.death_animation_timer >= 1.25 then + + item_drop(self,false,1) + + death_effect(self) + + self.object:remove() + + return + end + + --I'm sure there's a more efficient way to do this + --but this is the easiest, easier to work with 1 variable synced + --this is also not smooth + local death_animation_roll = self.death_animation_timer * 2 -- * 2 to make it faster + if death_animation_roll > 1 then + death_animation_roll = 1 + end + + local rot = self.object:get_rotation() --(no pun intended) + + rot.z = death_animation_roll * HALF_PI + + self.object:set_rotation(rot) + + mobs.set_mob_animation(self,"stand", true) + + + --flying and swimming mobs just fall down + if self.fly or self.swim then + if self.object:get_acceleration().y ~= -self.gravity then + self.object:set_acceleration(vector_new(0,-self.gravity,0)) + end + end + + --when landing allow mob to slow down and just fall if in air + if self.pause_timer <= 0 then + mobs.set_velocity(self,0) + end +end \ No newline at end of file From ef0d52a2df9a3d2d2c1e59b12084017c405bc398 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 21:41:54 -0400 Subject: [PATCH 166/176] Update backup_code_api.lua --- .../api/mob_functions/backup_code_api.lua | 38 ------------------- 1 file changed, 38 deletions(-) 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.lua index 76a319d334..a6d27040e0 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua @@ -2758,45 +2758,7 @@ function do_states(self) end - mobs.death_effect = function(pos, yaw, collisionbox, rotate) - local min, max - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - else - min = { x = -0.5, y = 0, z = -0.5 } - 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, max = vector.sort(min, max) - min = vector.multiply(min, 0.5) - max = vector.multiply(max, 0.5) - end - minetest_add_particlespawner({ - amount = 50, - time = 0.001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector.new(-5,-5,-5), - maxvel = vector.new(5,5,5), - minexptime = 1.1, - maxexptime = 1.5, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_mob_death.png^[colorize:#000000:255", - }) - - minetest_sound_play("mcl_mobs_mob_poof", { - pos = pos, - gain = 1.0, - max_hear_distance = 8, - }, true) - end -- above function exported for mount.lua function mobs:set_animation(self, anim) From 5d876725c599b060c5150b0508f21b6a83001f9a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 21:45:00 -0400 Subject: [PATCH 167/176] Fix bats --- mods/ENTITIES/mobs_mc/bat.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index 677b96aad3..a112e954b9 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -7,6 +7,9 @@ mobs:register_mob("mobs_mc:bat", { spawn_class = "ambient", can_despawn = true, passive = true, + rotate = 270, + tilt_fly = true, + fly = true, hp_min = 6, hp_max = 6, collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25}, @@ -44,9 +47,7 @@ mobs:register_mob("mobs_mc:bat", { fall_damage = 0, view_range = 16, fear_height = 0, - jump = false, - fly = true, makes_footstep_sound = false, }) From afdcada1fd6f7c8cbe68b0fd1486d6d92f3d12f7 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 21:46:13 -0400 Subject: [PATCH 168/176] Fix endermite --- mods/ENTITIES/mobs_mc/endermite.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua index e413f65b30..f0334d5c69 100644 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ b/mods/ENTITIES/mobs_mc/endermite.lua @@ -8,6 +8,8 @@ mobs:register_mob("mobs_mc:endermite", { type = "monster", spawn_class = "hostile", passive = false, + rotate = 270, + hostile = true, hp_min = 8, hp_max = 8, xp_min = 3, From 0a8fff65249610aba7fef7e9675bf28469265f29 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 22:08:54 -0400 Subject: [PATCH 169/176] Add in mob criticals when falling --- mods/ENTITIES/mcl_mobs/api/api.lua | 1 + .../api/mob_functions/death_logic.lua | 34 +---------- .../api/mob_functions/interaction.lua | 8 +++ .../api/mob_functions/mob_effects.lua | 61 +++++++++++++++++++ 4 files changed, 71 insertions(+), 33 deletions(-) create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index e5e9d32f48..98bb443c5c 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -160,6 +160,7 @@ dofile(api_path .. "set_up.lua") dofile(api_path .. "attack_type_instructions.lua") dofile(api_path .. "sound_handling.lua") dofile(api_path .. "death_logic.lua") +dofile(api_path .. "mob_effects.lua") mobs.spawning_mobs = {} 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 53d517a584..1666993585 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,4 @@ local minetest_add_item = minetest.add_item -local minetest_add_particlespawner = minetest.add_particlespawner local minetest_sound_play = minetest.sound_play local math_pi = math.pi @@ -10,37 +9,6 @@ local HALF_PI = math_pi / 2 local vector_new = vector.new -local death_effect = function(self) - - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() - local collisionbox = self.object:get_properties().collisionbox - - local min, max - - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - end - - minetest_add_particlespawner({ - amount = 50, - time = 0.001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector.new(-0.5,0.5,-0.5), - maxvel = vector.new(0.5,1,0.5), - minexptime = 1.1, - maxexptime = 1.5, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_mob_death.png", -- this particle looks strange - }) -end - - -- drop items local item_drop = function(self, cooked, looting_level) @@ -127,7 +95,7 @@ mobs.death_logic = function(self, dtime) item_drop(self,false,1) - death_effect(self) + mobs.death_effect(self) self.object:remove() diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index 32011aafe8..f43075b4e0 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -170,6 +170,14 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end end + + --if player is falling multiply damage by 1.5 + --critical hit + if hitter:get_velocity().y < 0 then + damage = damage * 1.5 + mobs.critical_effect(self) + end + local die = false -- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately. diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua new file mode 100644 index 0000000000..1bf79f8aab --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua @@ -0,0 +1,61 @@ +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 collisionbox = self.object:get_properties().collisionbox + + local min, max + + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + end + + minetest_add_particlespawner({ + amount = 50, + time = 0.0001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-0.5,0.5,-0.5), + maxvel = vector.new(0.5,1,0.5), + minexptime = 1.1, + maxexptime = 1.5, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_mob_death.png", -- this particle looks strange + }) +end + +mobs.critical_effect = function(self) + + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() + local collisionbox = self.object:get_properties().collisionbox + + local min, max + + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + end + + minetest_add_particlespawner({ + amount = 10, + time = 0.0001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-1,1,-1), + maxvel = vector.new(1,3,1), + minexptime = 0.7, + maxexptime = 1, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "heart.png^[colorize:black:255", + }) +end \ No newline at end of file From 5037ec3736a564157408df12699c91df17c934b6 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 22:40:16 -0400 Subject: [PATCH 170/176] Fix ghasts horrible collisionbox --- mods/ENTITIES/mcl_mobs/api/api.lua | 7 ++++-- mods/ENTITIES/mobs_mc/ghast.lua | 35 +++++++++++++++++++----------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 98bb443c5c..307a180903 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -529,9 +529,12 @@ function mobs:register_arrow(name, def) if self.hit_player and player:is_player() then - mobs.arrow_hit(self, player) + if self.hit_player then + self.hit_player(self, player) + else + mobs.arrow_hit(self, player) + end - print("wow everything is fucked") self.object:remove(); return end diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 8a800b7882..5bcab05222 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -13,13 +13,15 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:ghast", { type = "monster", spawn_class = "hostile", - pathfinding = 1, group_attack = true, + hostile = true, hp_min = 10, hp_max = 10, xp_min = 5, xp_max = 5, - collisionbox = {-2, 5, -2, 2, 9, 2}, + reach = 60, + eye_height = 3, + collisionbox = {-2, 0, -2, 2, 4, 2}, visual = "mesh", mesh = "mobs_mc_ghast.b3d", textures = { @@ -35,8 +37,10 @@ mobs:register_mob("mobs_mc:ghast", { -- TODO: damage -- TODO: better death }, + walk_velocity = 1.6, run_velocity = 3.2, + drops = { {name = mobs_mc.items.gunpowder, chance = 1, min = 0, max = 2, looting = "common"}, {name = mobs_mc.items.ghast_tear, chance = 10/6, min = 0, max = 1, looting = "common", looting_ignore_chance = true}, @@ -47,22 +51,21 @@ mobs:register_mob("mobs_mc:ghast", { walk_start = 0, walk_end = 40, run_start = 0, run_end = 40, }, + fall_damage = 0, view_range = 100, attack_type = "projectile", arrow = "mobs_mc:fireball", - shoot_interval = 3.5, - shoot_offset = -5, - dogshoot_switch = 1, - dogshoot_count_max =1, - passive = false, - jump = true, - jump_height = 4, floats=1, fly = true, makes_footstep_sound = false, - instant_death = true, fire_resistant = true, + shoot_arrow = function(self, pos, dir) + -- 2-4 damage per arrow + local dmg = math.random(2,4) + mcl_bows.shoot_arrow("mobs_mc:fireball", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + end, + --[[ do_custom = function(self) if self.firing == true then self.base_texture = {"mobs_mc_ghast_firing.png"} @@ -72,6 +75,7 @@ mobs:register_mob("mobs_mc:ghast", { self.object:set_properties({textures=self.base_texture}) end end, + ]]-- }) @@ -102,11 +106,14 @@ mobs:register_arrow("mobs_mc:fireball", { if rawget(_G, "armor") and armor.last_damage_types then armor.last_damage_types[player:get_player_name()] = "fireball" end + --[[ player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 6}, }, nil) - mobs:boom(self, self.object:get_pos(), 1, true) + ]]-- + --mobs:boom(self, self.object:get_pos(), 1, true) + mcl_explosions.explode(self.object:get_pos(), 3,{ drop_chance = 1.0 }) end, hit_mob = function(self, mob) @@ -114,11 +121,13 @@ mobs:register_arrow("mobs_mc:fireball", { full_punch_interval = 1.0, damage_groups = {fleshy = 6}, }, nil) - mobs:boom(self, self.object:get_pos(), 1, true) + --mobs:boom(self, self.object:get_pos(), 1, true) + mcl_explosions.explode(self.object:get_pos(), 3,{ drop_chance = 1.0 }) end, hit_node = function(self, pos, node) - mobs:boom(self, pos, 1, true) + --mobs:boom(self, pos, 1, true) + mcl_explosions.explode(self.object:get_pos(), 3,{ drop_chance = 1.0 }) end }) From 2099be43ea25740a402587f40b3004f6ef2d8c1d Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 22:50:14 -0400 Subject: [PATCH 171/176] Update to epCode's fixed version of ghast model --- .../ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d | Bin 75657 -> 69843 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d index cebc037c05efdcf2343c4232099b12fffc4c5c89..ab34f334f8321e30f05ae4b53a946b4095587ef0 100644 GIT binary patch delta 18141 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 KUl*Z12>%DJKTiJu literal 75657 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 V09X&5s-C+ER1az5QHx%`0RZsDdanQg From 11bcf3aa34e85dcc19142258ca2c4abaf963b806 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 22:51:13 -0400 Subject: [PATCH 172/176] Add attributes to epCode --- mods/ENTITIES/mobs_mc/models/attributes.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 mods/ENTITIES/mobs_mc/models/attributes.txt diff --git a/mods/ENTITIES/mobs_mc/models/attributes.txt b/mods/ENTITIES/mobs_mc/models/attributes.txt new file mode 100644 index 0000000000..ec59e0f702 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/models/attributes.txt @@ -0,0 +1 @@ +Ghast fixed by epCode - Thanks! \ No newline at end of file From 2e3e92e39337e5c4ecba13855f134af1bd672ae6 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 22:58:32 -0400 Subject: [PATCH 173/176] Fix ghast's insane difficulty --- mods/ENTITIES/mobs_mc/ghast.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 5bcab05222..81a5517128 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -17,9 +17,10 @@ mobs:register_mob("mobs_mc:ghast", { hostile = true, hp_min = 10, hp_max = 10, + rotate = 270, xp_min = 5, xp_max = 5, - reach = 60, + reach = 20, eye_height = 3, collisionbox = {-2, 0, -2, 2, 4, 2}, visual = "mesh", @@ -53,7 +54,7 @@ mobs:register_mob("mobs_mc:ghast", { }, fall_damage = 0, - view_range = 100, + view_range = 28, attack_type = "projectile", arrow = "mobs_mc:fireball", floats=1, From fa059b5df245e81d71d73bbc87b51c59cd47a876 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 22 Apr 2021 22:59:03 -0400 Subject: [PATCH 174/176] Fix ghast's eyeheight --- mods/ENTITIES/mobs_mc/ghast.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 81a5517128..368d3726d1 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -21,7 +21,7 @@ mobs:register_mob("mobs_mc:ghast", { xp_min = 5, xp_max = 5, reach = 20, - eye_height = 3, + eye_height = 2.5, collisionbox = {-2, 0, -2, 2, 4, 2}, visual = "mesh", mesh = "mobs_mc_ghast.b3d", From 038066f0c551d7ad4d929c92ca5f71f7d6544032 Mon Sep 17 00:00:00 2001 From: Sven792 Date: Fri, 23 Apr 2021 09:52:09 +0200 Subject: [PATCH 175/176] Mirrored foodbar icons to fit the right-to-left change --- .../mcl_hunger/textures/hbhunger_bgicon.png | Bin 114 -> 170 bytes .../mcl_hunger/textures/hbhunger_icon.png | Bin 142 -> 209 bytes .../textures/mcl_hunger_icon_foodpoison.png | Bin 141 -> 218 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/textures/hbhunger_bgicon.png b/mods/PLAYER/mcl_hunger/textures/hbhunger_bgicon.png index e02778a2702183d3a01039d42258c0cc956608b8..d21b1684786017be48a478eb8b15f6dd09153ea5 100644 GIT binary patch delta 141 zcmV;80CN9wssWHBe+h6%S#tmY3ljhU3ljkVnw%H_003M`L_t&-(~XeJ3cw%?1jpjh z()Is8vMG8`FIue7#~hd4fg}J(*=d;Vfr$wCnlxrU7o(Kfl;-iRxBwhhc_X%k18hp8 v^|CEJDb*g0ak|J$HGU&y@2?48MSv6Oh9~4Jahr_*0000<2SrXqu0mjf;Egy( delta 84 zcmZ3*STsS!&(hPyF{FYq`2ZUW3(Nn*27auYjJgVVM1J*$Hum-D$uJ-NpvAP=G08>q nKuAkKL#$w2e4>XySOX`6;dbM$1x|I*3_#%N>gTe~DWM4f%^Vz6 diff --git a/mods/PLAYER/mcl_hunger/textures/hbhunger_icon.png b/mods/PLAYER/mcl_hunger/textures/hbhunger_icon.png index 9c1bb63e48bb6b84c273202e9b4c8688a6aa1c70..3830fdfc3cf99855334cccf433ebcdb0859ac689 100644 GIT binary patch delta 192 zcmeBUyvR5~vYw5Bf#JbKHUS{TS>O>_%)r1c48n{Iv*t(u1)Dux977~7C#NJNB)sU` z@b^3e>r!n#W1|I()8291{y)v^7LU=YB7=?pUvSO5P}-_iwP?nf13+*Hh(A1eD7}MW zQfI*dj^fE{)>t(6?BQVcx%~LJ{=;|8(cgc3^cJxcHuPy?Oxb><^ov1<_6%dA2h8Gq qI{*HEI(YKGgj!;-hUVg93=FDKx?dB+w>|;7hr!d;&t;ucLK6VU%upWy delta 124 zcmcb}*vB|QvXqH|fg%6%M0X&?RubeF45Wb|ZyEbUAm!}o;uuoFnC!rOS8$s^i|eC< z=gbtWj8vIVxJ^Hx$u7vcNOY;9gPs%9iQ`ioP8?JXcoJu4(fQ1&O>_%)r1c48n{Iv*t(u1$#VQ977~7C#NJNByfBX z{C%E*ReIZ=q!b5c9Y(vP|DsoyN~&CqNJ#pBQPgPR>rJ1gx*N`H1cFu|et7pYKMxNN z6A<&9P&>q^e8%@r%^e=6Ndm3!=hY|t`0-NP=}v9IYrDE%T&5ElcY7K%yqUI1LY-}O xhiDJaj{~bX?f&<#?fB83C}h@ZBxJ+GaJWu1qNLJLp=fS?83{1OV&@BHI7} From 827cd2d7b1d4d6980eaa564956b6ea7d467133a5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 23 Apr 2021 13:42:42 +0200 Subject: [PATCH 176/176] Fix heads crash --- mods/ITEMS/mcl_heads/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index e7340242d8..55b2bf616b 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -90,7 +90,7 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) local wdir = minetest.dir_to_wallmounted(diff) local itemstring = itemstack:get_name() - --local fakestack = ItemStack(itemstack) + local fakestack = ItemStack(itemstack) local idef = fakestack:get_definition() local retval if wdir == 0 or wdir == 1 then

    xAP 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

  • 75!%R;YNFRwNgk` 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%0AuQmLD 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 literal 453135 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�IO0jbSm!vY+(~ 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
  • < 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