From d1d9f76c5d85f7ff8b723cb944469e7e2b505a55 Mon Sep 17 00:00:00 2001 From: epCode Date: Thu, 27 Oct 2022 20:18:49 +0000 Subject: [PATCH 1/8] Mobs set players on fire if they are/dogshoot strafing and enemy avoidance --- mods/ENTITIES/mcl_mobs/api.lua | 132 ++++++++++++++------------------- 1 file changed, 54 insertions(+), 78 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index a53dfd169..00f5c4450 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -13,8 +13,6 @@ local FLOP_HOR_SPEED = 1.5 local ENTITY_CRAMMING_MAX = 24 local CRAMMING_DAMAGE = 3 -local PATHFINDING = "gowp" - -- Localize local S = minetest.get_translator("mcl_mobs") @@ -320,6 +318,10 @@ local collision = function(self) local ent = object:get_luaentity() if object:is_player() or (ent and ent.is_mob and object ~= self.object) then + if object:is_player() and mcl_burning.is_burning(self.object) then + mcl_burning.set_on_fire(object, 4) + end + local pos2 = object:get_pos() local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} local force = (width + 0.5) - vector.distance( @@ -1345,6 +1347,7 @@ local do_env_damage = function(self) self.health = self.health - self.lava_damage effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) + mcl_burning.set_on_fire(self.object, 10) if check_for_death(self, "lava", {type = "environment", pos = pos, node = self.standing_in}) then @@ -1361,6 +1364,7 @@ local do_env_damage = function(self) self.health = self.health - self.fire_damage effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) + mcl_burning.set_on_fire(self.object, 5) if check_for_death(self, "fire", {type = "environment", pos = pos, node = self.standing_in}) then @@ -2548,11 +2552,10 @@ local function check_doors(self) if n.name:find("_b_") then local def = minetest.registered_nodes[n.name] local closed = n.name:find("_b_1") - if self.state == PATHFINDING then - if closed and def.on_rightclick then def.on_rightclick(d,n,self) end - --if not closed and def.on_rightclick then def.on_rightclick(d,n,self) end + if t < 0.3 or t > 0.8 then + if not closed and def.on_rightclick then def.on_rightclick(d,n,self) end else - + if closed and def.on_rightclick then def.on_rightclick(d,n,self) end end end @@ -2563,7 +2566,7 @@ local gowp_etime = 0 local function check_gowp(self,dtime) gowp_etime = gowp_etime + dtime - if gowp_etime < 0.1 then return end + if gowp_etime < 0.2 then return end gowp_etime = 0 local p = self.object:get_pos() @@ -2574,7 +2577,7 @@ local function check_gowp(self,dtime) return end - -- arrived at location, finish gowp + -- arrived at location local distance_to_targ = vector.distance(p,self._target) mcl_log("Distance to targ: ".. tostring(distance_to_targ)) if distance_to_targ < 2 then @@ -2590,79 +2593,34 @@ local function check_gowp(self,dtime) return true end - -- More pathing to be done - if self.waypoints and #self.waypoints > 0 and ( not self.current_target or vector.distance(p,self.current_target) < 2 ) then - -- We have waypoints, and no current target, or we're at it. We need a new current_target. - + if self.waypoints and ( not self.current_target or vector.distance(p,self.current_target) < 2 ) then if not self.current_target then for i, j in pairs (self.waypoints) do + mcl_log("Way: ".. tostring(i)) mcl_log("Val: ".. tostring(j)) end + --mcl_log("nextwp:".. tostring(self.waypoints) ) end self.current_target = table.remove(self.waypoints, 1) - mcl_log("current target:".. minetest.pos_to_string(self.current_target) ) + mcl_log("current target:".. tostring(self.current_target) ) --mcl_log("type:".. type(self.current_target) ) go_to_pos(self,self.current_target) return elseif self.current_target then - -- No waypoints left, but have current target. Potentially last waypoint to go to. - - mcl_log("self.current_target: ".. minetest.pos_to_string(self.current_target)) - mcl_log("pos: ".. minetest.pos_to_string(p)) go_to_pos(self,self.current_target) - -- Do i just delete current_target, and return so we can find final path. - else - -- Not at target, no current waypoints or current_target. Through the door and should be able to path to target. - -- Is a little sensitive and could take 1 - 7 times. A 10 fail count might be a good exit condition. - - mcl_log("We don't have waypoints or a current target. Let's try to path to target") - local final_wp = minetest.find_path(p,self._target,150,1,4) - if final_wp then - mcl_log("We might be able to get to target here.") - self.waypoints = final_wp - --go_to_pos(self,self._target) - else - mcl_log("Cannot plot final route to target") - end end - --if self.current_target and not minetest.line_of_sight(self.object:get_pos(),self.current_target) then - if self.current_target and (self.waypoints and #self.waypoints == 0) then - local updated_p = self.object:get_pos() - local distance_to_cur_targ = vector.distance(updated_p,self.current_target) - - mcl_log("Distance to current target: ".. tostring(distance_to_cur_targ)) - mcl_log("Current p: ".. minetest.pos_to_string(updated_p)) - --if not minetest.line_of_sight(self.object:get_pos(),self._target) then - - -- 1.6 is good. is 1.9 better? It could fail less, but will it path to door when it isn't after door - if distance_to_cur_targ > 1.9 then - mcl_log("no LOS to target: ".. minetest.pos_to_string(self.current_target)) - go_to_pos(self,self._current_target) - else - mcl_log("Let's go to target: ".. minetest.pos_to_string(self.current_target)) - self.current_target = nil - --go_to_pos(self,self._target) - self.waypoints=minetest.find_path(updated_p,self._target,150,1,4) - --if not self.waypoints then - --mcl_log("Give up ") - --self.state = "walk" - --end --give up - end - - --self.waypoints=minetest.find_path(p,self._target,150,1,4) - --if not self.waypoints then - --mcl_log("Give up ") - --self.state = "walk" - --end --give up - --self.current_target = nil + if self.current_target and not minetest.line_of_sight(self.object:get_pos(),self.current_target) then + self.waypoints=minetest.find_path(p,self._target,150,1,4) + if not self.waypoints then self.state = "walk" end --give up + self.current_target = nil return end - --if not self.current_target then - --mcl_log("no path. Give up") - --self.state = "walk" - --end + if not self.current_target then + --mcl_log("no path") + self.state = "walk" + end end -- execute current state (stand, walk, run, attacks) @@ -2711,7 +2669,7 @@ local do_states = function(self, dtime) end -- npc's ordered to stand stay standing - if self.order == "stand" or self.order == "sleep" or self.order == "work" then + if self.type == "npc" or (self.order == "stand" or self.order == "sleep" or self.order == "work") then else if self.walk_chance ~= 0 @@ -2725,7 +2683,7 @@ local do_states = function(self, dtime) end end - elseif self.state == PATHFINDING then + elseif self.state == "gowp" then check_gowp(self,dtime) elseif self.state == "walk" then @@ -2978,7 +2936,7 @@ local do_states = function(self, dtime) end elseif self.attack_type == "dogfight" - or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 2) + or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 2) and (dist >= 9 or not self.shooter_avoid_enemy) or (self.attack_type == "dogshoot" and dist <= self.reach and dogswitch(self) == 0) then if self.fly @@ -3155,7 +3113,7 @@ local do_states = function(self, dtime) 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 + or (self.attack_type == "dogshoot" and (dist > self.reach or dist < 9 and self.shooter_avoid_enemy) and dogswitch(self) == 0) then p.y = p.y - .5 s.y = s.y + .5 @@ -3173,7 +3131,27 @@ local do_states = function(self, dtime) yaw = set_yaw(self, yaw, 0, dtime) - set_velocity(self, 0) + local stay_away_from_player = vector.new(0,0,0) + + --strafe back and fourth + + --stay away from player so as to shoot them + if dist < 9 and self.shooter_avoid_enemy then + set_animation(self, "walk") + stay_away_from_player=vector.multiply(vector.direction(p, s), 0.33) + end + + if self.strafes then + if not self.strafe_direction then + self.strafe_direction = 1.57 + end + if math.random(40) == 1 then + self.strafe_direction = self.strafe_direction*-1 + end + self.acc = vector.add(vector.multiply(vector.rotate_around_axis(vector.direction(s, p), vector.new(0,1,0), self.strafe_direction), 0.3*self.walk_velocity), stay_away_from_player) + else + set_velocity(self, 0) + end local p = self.object:get_pos() p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 @@ -3242,7 +3220,7 @@ local plane_adjacents = { local gopath_last = os.time() function mcl_mobs:gopath(self,target,callback_arrived) - if self.state == PATHFINDING then mcl_log("Already set as gowp, don't set another path until done.") return end + if self.state == "gowp" then mcl_log("Already set as gowp, don't set another path until done.") return end if os.time() - gopath_last < 15 then mcl_log("Not ready to path yet") @@ -3265,15 +3243,11 @@ function mcl_mobs:gopath(self,target,callback_arrived) --mcl_log("Found a door near") for _,v in pairs(plane_adjacents) do local pos = vector.add(d,v) - local n = minetest.get_node(pos) if n.name == "air" then wp = minetest.find_path(p,pos,150,1,4) if wp then - mcl_log("Found a path to next to door".. minetest.pos_to_string(pos)) - local other_side_of_door = vector.add(d,-v) - mcl_log("Opposite is: ".. minetest.pos_to_string(other_side_of_door)) - table.insert(wp, other_side_of_door) + --mcl_log("Found a path to next to door".. minetest.pos_to_string(pos)) break else @@ -3293,7 +3267,7 @@ function mcl_mobs:gopath(self,target,callback_arrived) self.callback_arrived = callback_arrived table.remove(wp,1) self.waypoints = wp - self.state = PATHFINDING + self.state = "gowp" return true else self.state = "walk" @@ -4344,7 +4318,7 @@ local mob_step = function(self, dtime) -- attack timer self.timer = self.timer + dtime - if self.state ~= "attack" and self.state ~= PATHFINDING then + if self.state ~= "attack" and self.state ~= "gowp" then if self.timer < 1 then return end @@ -4664,6 +4638,8 @@ minetest.register_entity(name, { -- MCL2 extensions + shooter_avoid_enemy = def.shooter_avoid_enemy, + strafes = def.strafes, teleport = teleport, do_teleport = def.do_teleport, spawn_class = def.spawn_class, From de73129c2b0563c9fb5f222c2f52eb292ecae1c6 Mon Sep 17 00:00:00 2001 From: epCode Date: Thu, 27 Oct 2022 20:24:33 +0000 Subject: [PATCH 2/8] Make skeleton strafe and avoid enemies --- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index eb7c67802..18e1d99fe 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -30,6 +30,8 @@ local skeleton = { curiosity = 6, visual = "mesh", mesh = "mobs_mc_skeleton.b3d", + shooter_avoid_enemy = true, + strafes = true, textures = { { "mcl_bows_bow_0.png", -- bow "mobs_mc_skeleton.png", -- skeleton From 702ba252832a98fb87389cdf2c1f0bafa0fa66da Mon Sep 17 00:00:00 2001 From: epCode Date: Thu, 27 Oct 2022 20:42:58 +0000 Subject: [PATCH 3/8] Fix dogshooter animation when moving back --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 00f5c4450..37c9cad86 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3137,7 +3137,7 @@ local do_states = function(self, dtime) --stay away from player so as to shoot them if dist < 9 and self.shooter_avoid_enemy then - set_animation(self, "walk") + set_animation(self, "shoot") stay_away_from_player=vector.multiply(vector.direction(p, s), 0.33) end From eed5ec6f6387039f07afcdeca0a0474fb0511b53 Mon Sep 17 00:00:00 2001 From: epCode Date: Thu, 27 Oct 2022 20:56:23 +0000 Subject: [PATCH 4/8] return pathfinding changes --- mods/ENTITIES/mcl_mobs/api.lua | 98 ++++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 37c9cad86..40d26ef67 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -13,6 +13,8 @@ local FLOP_HOR_SPEED = 1.5 local ENTITY_CRAMMING_MAX = 24 local CRAMMING_DAMAGE = 3 +local PATHFINDING = "gowp" + -- Localize local S = minetest.get_translator("mcl_mobs") @@ -2552,10 +2554,11 @@ local function check_doors(self) if n.name:find("_b_") then local def = minetest.registered_nodes[n.name] local closed = n.name:find("_b_1") - if t < 0.3 or t > 0.8 then - if not closed and def.on_rightclick then def.on_rightclick(d,n,self) end - else + if self.state == PATHFINDING then if closed and def.on_rightclick then def.on_rightclick(d,n,self) end + --if not closed and def.on_rightclick then def.on_rightclick(d,n,self) end + else + end end @@ -2566,7 +2569,7 @@ local gowp_etime = 0 local function check_gowp(self,dtime) gowp_etime = gowp_etime + dtime - if gowp_etime < 0.2 then return end + if gowp_etime < 0.1 then return end gowp_etime = 0 local p = self.object:get_pos() @@ -2577,7 +2580,7 @@ local function check_gowp(self,dtime) return end - -- arrived at location + -- arrived at location, finish gowp local distance_to_targ = vector.distance(p,self._target) mcl_log("Distance to targ: ".. tostring(distance_to_targ)) if distance_to_targ < 2 then @@ -2593,34 +2596,79 @@ local function check_gowp(self,dtime) return true end - if self.waypoints and ( not self.current_target or vector.distance(p,self.current_target) < 2 ) then + -- More pathing to be done + if self.waypoints and #self.waypoints > 0 and ( not self.current_target or vector.distance(p,self.current_target) < 2 ) then + -- We have waypoints, and no current target, or we're at it. We need a new current_target. + if not self.current_target then for i, j in pairs (self.waypoints) do - mcl_log("Way: ".. tostring(i)) mcl_log("Val: ".. tostring(j)) end - --mcl_log("nextwp:".. tostring(self.waypoints) ) end self.current_target = table.remove(self.waypoints, 1) - mcl_log("current target:".. tostring(self.current_target) ) + mcl_log("current target:".. minetest.pos_to_string(self.current_target) ) --mcl_log("type:".. type(self.current_target) ) go_to_pos(self,self.current_target) return elseif self.current_target then + -- No waypoints left, but have current target. Potentially last waypoint to go to. + + mcl_log("self.current_target: ".. minetest.pos_to_string(self.current_target)) + mcl_log("pos: ".. minetest.pos_to_string(p)) go_to_pos(self,self.current_target) + -- Do i just delete current_target, and return so we can find final path. + else + -- Not at target, no current waypoints or current_target. Through the door and should be able to path to target. + -- Is a little sensitive and could take 1 - 7 times. A 10 fail count might be a good exit condition. + + mcl_log("We don't have waypoints or a current target. Let's try to path to target") + local final_wp = minetest.find_path(p,self._target,150,1,4) + if final_wp then + mcl_log("We might be able to get to target here.") + self.waypoints = final_wp + --go_to_pos(self,self._target) + else + mcl_log("Cannot plot final route to target") + end end - if self.current_target and not minetest.line_of_sight(self.object:get_pos(),self.current_target) then - self.waypoints=minetest.find_path(p,self._target,150,1,4) - if not self.waypoints then self.state = "walk" end --give up - self.current_target = nil + --if self.current_target and not minetest.line_of_sight(self.object:get_pos(),self.current_target) then + if self.current_target and (self.waypoints and #self.waypoints == 0) then + local updated_p = self.object:get_pos() + local distance_to_cur_targ = vector.distance(updated_p,self.current_target) + + mcl_log("Distance to current target: ".. tostring(distance_to_cur_targ)) + mcl_log("Current p: ".. minetest.pos_to_string(updated_p)) + --if not minetest.line_of_sight(self.object:get_pos(),self._target) then + + -- 1.6 is good. is 1.9 better? It could fail less, but will it path to door when it isn't after door + if distance_to_cur_targ > 1.9 then + mcl_log("no LOS to target: ".. minetest.pos_to_string(self.current_target)) + go_to_pos(self,self._current_target) + else + mcl_log("Let's go to target: ".. minetest.pos_to_string(self.current_target)) + self.current_target = nil + --go_to_pos(self,self._target) + self.waypoints=minetest.find_path(updated_p,self._target,150,1,4) + --if not self.waypoints then + --mcl_log("Give up ") + --self.state = "walk" + --end --give up + end + + --self.waypoints=minetest.find_path(p,self._target,150,1,4) + --if not self.waypoints then + --mcl_log("Give up ") + --self.state = "walk" + --end --give up + --self.current_target = nil return end - if not self.current_target then - --mcl_log("no path") - self.state = "walk" - end + --if not self.current_target then + --mcl_log("no path. Give up") + --self.state = "walk" + --end end -- execute current state (stand, walk, run, attacks) @@ -2669,7 +2717,7 @@ local do_states = function(self, dtime) end -- npc's ordered to stand stay standing - if self.type == "npc" or (self.order == "stand" or self.order == "sleep" or self.order == "work") then + if self.order == "stand" or self.order == "sleep" or self.order == "work" then else if self.walk_chance ~= 0 @@ -2683,7 +2731,7 @@ local do_states = function(self, dtime) end end - elseif self.state == "gowp" then + elseif self.state == PATHFINDING then check_gowp(self,dtime) elseif self.state == "walk" then @@ -3220,7 +3268,7 @@ local plane_adjacents = { local gopath_last = os.time() function mcl_mobs:gopath(self,target,callback_arrived) - if self.state == "gowp" then mcl_log("Already set as gowp, don't set another path until done.") return end + if self.state == PATHFINDING then mcl_log("Already set as gowp, don't set another path until done.") return end if os.time() - gopath_last < 15 then mcl_log("Not ready to path yet") @@ -3243,11 +3291,15 @@ function mcl_mobs:gopath(self,target,callback_arrived) --mcl_log("Found a door near") for _,v in pairs(plane_adjacents) do local pos = vector.add(d,v) + local n = minetest.get_node(pos) if n.name == "air" then wp = minetest.find_path(p,pos,150,1,4) if wp then - --mcl_log("Found a path to next to door".. minetest.pos_to_string(pos)) + mcl_log("Found a path to next to door".. minetest.pos_to_string(pos)) + local other_side_of_door = vector.add(d,-v) + mcl_log("Opposite is: ".. minetest.pos_to_string(other_side_of_door)) + table.insert(wp, other_side_of_door) break else @@ -3267,7 +3319,7 @@ function mcl_mobs:gopath(self,target,callback_arrived) self.callback_arrived = callback_arrived table.remove(wp,1) self.waypoints = wp - self.state = "gowp" + self.state = PATHFINDING return true else self.state = "walk" @@ -4318,7 +4370,7 @@ local mob_step = function(self, dtime) -- attack timer self.timer = self.timer + dtime - if self.state ~= "attack" and self.state ~= "gowp" then + if self.state ~= "attack" and self.state ~= PATHFINDING then if self.timer < 1 then return end From 83d92e08cab82c1f807fa68f2065ac9c494b6ad7 Mon Sep 17 00:00:00 2001 From: epCode Date: Thu, 27 Oct 2022 23:37:11 +0000 Subject: [PATCH 5/8] add an adjustable variable for avoid distance --- mods/ENTITIES/mcl_mobs/api.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 40d26ef67..e58eec00e 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2984,7 +2984,7 @@ local do_states = function(self, dtime) end elseif self.attack_type == "dogfight" - or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 2) and (dist >= 9 or not self.shooter_avoid_enemy) + or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 2) and (dist >= self.avoid_distance or not self.shooter_avoid_enemy) or (self.attack_type == "dogshoot" and dist <= self.reach and dogswitch(self) == 0) then if self.fly @@ -3161,7 +3161,7 @@ local do_states = function(self, dtime) elseif self.attack_type == "shoot" or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 1) - or (self.attack_type == "dogshoot" and (dist > self.reach or dist < 9 and self.shooter_avoid_enemy) and dogswitch(self) == 0) then + or (self.attack_type == "dogshoot" and (dist > self.reach or dist < self.avoid_distance and self.shooter_avoid_enemy) and dogswitch(self) == 0) then p.y = p.y - .5 s.y = s.y + .5 @@ -3184,7 +3184,7 @@ local do_states = function(self, dtime) --strafe back and fourth --stay away from player so as to shoot them - if dist < 9 and self.shooter_avoid_enemy then + if dist < self.avoid_distance and self.shooter_avoid_enemy then set_animation(self, "shoot") stay_away_from_player=vector.multiply(vector.direction(p, s), 0.33) end @@ -4692,6 +4692,7 @@ minetest.register_entity(name, { -- MCL2 extensions shooter_avoid_enemy = def.shooter_avoid_enemy, strafes = def.strafes, + avoid_distance = def.avoid_distance or 9, teleport = teleport, do_teleport = def.do_teleport, spawn_class = def.spawn_class, From 4fa1c445cc9e3c4291316d1e166e4104c9628dbc Mon Sep 17 00:00:00 2001 From: epCode Date: Fri, 28 Oct 2022 01:56:27 +0000 Subject: [PATCH 6/8] add customizable speed to mounts, not set value. --- mods/ENTITIES/mcl_mobs/mount.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/mount.lua b/mods/ENTITIES/mcl_mobs/mount.lua index 3944613a5..95a145a4b 100644 --- a/mods/ENTITIES/mcl_mobs/mount.lua +++ b/mods/ENTITIES/mcl_mobs/mount.lua @@ -206,7 +206,7 @@ function mcl_mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) -- move forwards if ctrl.up then - entity.v = entity.v + entity.accel / 10 + entity.v = entity.v + entity.accel / 10 * entity.run_velocity / 2.6 -- move backwards elseif ctrl.down then From 5378d8eba79400a97101b48a7fbcd95c9082491e Mon Sep 17 00:00:00 2001 From: epCode Date: Fri, 28 Oct 2022 01:57:15 +0000 Subject: [PATCH 7/8] add random horse speed per mc wiki --- mods/ENTITIES/mobs_mc/horse.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 0632f4d33..e4f8f72fc 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -181,6 +181,13 @@ local horse = { on_spawn = update_textures, do_custom = function(self, dtime) + if not self._horse_speed then + self._horse_speed = math.random(486, 1457)/100 + else + minetest.chat_send_all(self._horse_speed) + self.run_velocity = self._horse_speed + end + -- set needed values if not already present if not self._regentimer then self._regentimer = 0 From 2b2c2cf9cc0816b516480e558a24e7f817c008be Mon Sep 17 00:00:00 2001 From: epCode Date: Fri, 28 Oct 2022 02:00:39 +0000 Subject: [PATCH 8/8] remove debug and remove resetting value 20 times per second --- mods/ENTITIES/mobs_mc/horse.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index e4f8f72fc..d1c865968 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -183,8 +183,7 @@ local horse = { if not self._horse_speed then self._horse_speed = math.random(486, 1457)/100 - else - minetest.chat_send_all(self._horse_speed) + elseif self.run_velocity ~= self._horse_speed then self.run_velocity = self._horse_speed end