forked from mtcontrib/mobs_redo
		
	use atan2, added attached attack, added swim to shore
This commit is contained in:
		
							
								
								
									
										97
									
								
								api.lua
									
									
									
									
									
								
							
							
						
						
									
										97
									
								
								api.lua
									
									
									
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
 | 
			
		||||
-- Mobs Api (6th December 2016)
 | 
			
		||||
-- Mobs Api (16th December 2016)
 | 
			
		||||
 | 
			
		||||
mobs = {}
 | 
			
		||||
mobs.mod = "redo"
 | 
			
		||||
@@ -72,6 +72,7 @@ local atan = function(x)
 | 
			
		||||
		return atann(x)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
local atan2 = math.atan2
 | 
			
		||||
 | 
			
		||||
do_attack = function(self, player)
 | 
			
		||||
 | 
			
		||||
@@ -362,7 +363,7 @@ function check_for_death(self)
 | 
			
		||||
 | 
			
		||||
				obj:setvelocity({
 | 
			
		||||
					x = random(-10, 10) / 9,
 | 
			
		||||
					y = 5,
 | 
			
		||||
					y = 6,
 | 
			
		||||
					z = random(-10, 10) / 9,
 | 
			
		||||
				})
 | 
			
		||||
			end
 | 
			
		||||
@@ -1211,16 +1212,10 @@ local follow_flop = function(self)
 | 
			
		||||
			else
 | 
			
		||||
				local vec = {
 | 
			
		||||
					x = p.x - s.x,
 | 
			
		||||
					y = p.y - s.y,
 | 
			
		||||
					z = p.z - s.z
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				local yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate
 | 
			
		||||
 | 
			
		||||
				if p.x > s.x then
 | 
			
		||||
					yaw = yaw + pi
 | 
			
		||||
				end
 | 
			
		||||
 | 
			
		||||
				local yaw = (atan2(vec.z, vec.x) - pi / 2) - self.rotate
 | 
			
		||||
				self.object:setyaw(yaw)
 | 
			
		||||
 | 
			
		||||
				-- anyone but standing npc's can move along
 | 
			
		||||
@@ -1320,17 +1315,12 @@ local do_states = function(self, dtime)
 | 
			
		||||
 | 
			
		||||
				local vec = {
 | 
			
		||||
					x = lp.x - s.x,
 | 
			
		||||
					y = lp.y - s.y,
 | 
			
		||||
					z = lp.z - s.z
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate
 | 
			
		||||
 | 
			
		||||
				if lp.x > s.x then
 | 
			
		||||
					yaw = yaw + pi
 | 
			
		||||
				end
 | 
			
		||||
				yaw = (atan2(vec.z, vec.x) - pi / 2) - self.rotate
 | 
			
		||||
			else
 | 
			
		||||
				yaw = (random(0, 360) - 180) / 180 * pi
 | 
			
		||||
				yaw = random() * 2 * pi
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			self.object:setyaw(yaw)
 | 
			
		||||
@@ -1373,19 +1363,36 @@ local do_states = function(self, dtime)
 | 
			
		||||
			lp = minetest.find_node_near(s, 1, {"group:lava"})
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		-- if something then avoid
 | 
			
		||||
		if lp then
 | 
			
		||||
 | 
			
		||||
			local vec = {
 | 
			
		||||
				x = lp.x - s.x,
 | 
			
		||||
				y = lp.y - s.y,
 | 
			
		||||
				z = lp.z - s.z
 | 
			
		||||
			}
 | 
			
		||||
			-- if mob in water or lava then look for land
 | 
			
		||||
			if (self.lava_damage and minetest.registered_nodes[self.standing_in].groups.lava)
 | 
			
		||||
			or (self.water_damage and minetest.registered_nodes[self.standing_in].groups.water) then
 | 
			
		||||
 | 
			
		||||
			yaw = atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate
 | 
			
		||||
				lp = minetest.find_node_near(s, 5, {"group:soil", "group:stone",
 | 
			
		||||
					"group:sand", "default:ice", "default:snowblock"})
 | 
			
		||||
 | 
			
		||||
			if lp.x > s.x then
 | 
			
		||||
				yaw = yaw + pi
 | 
			
		||||
				-- did we find land?
 | 
			
		||||
				if lp then
 | 
			
		||||
 | 
			
		||||
					local vec = {
 | 
			
		||||
						x = lp.x - s.x,
 | 
			
		||||
						z = lp.z - s.z
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					yaw = atan2(vec.z, vec.x) + pi / 2 - self.rotate
 | 
			
		||||
				else
 | 
			
		||||
					yaw = random() * 2 * pi
 | 
			
		||||
				end
 | 
			
		||||
 | 
			
		||||
			else
 | 
			
		||||
 | 
			
		||||
				local vec = {
 | 
			
		||||
					x = lp.x - s.x,
 | 
			
		||||
					z = lp.z - s.z
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				yaw = atan2(vec.z, vec.x) + pi / 2 - self.rotate
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			self.object:setyaw(yaw)
 | 
			
		||||
@@ -1393,7 +1400,7 @@ local do_states = function(self, dtime)
 | 
			
		||||
		-- otherwise randomly turn
 | 
			
		||||
		elseif random(1, 100) <= 30 then
 | 
			
		||||
 | 
			
		||||
			local yaw = (random(0, 360) - 180) / 180 * pi
 | 
			
		||||
			yaw = random() * 2 * pi
 | 
			
		||||
 | 
			
		||||
			self.object:setyaw(yaw)
 | 
			
		||||
		end
 | 
			
		||||
@@ -1477,15 +1484,10 @@ local do_states = function(self, dtime)
 | 
			
		||||
 | 
			
		||||
			local vec = {
 | 
			
		||||
				x = p.x - s.x,
 | 
			
		||||
				y = p.y - s.y,
 | 
			
		||||
				z = p.z - s.z
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			yaw = atan(vec.z / vec.x) + pi / 2 - self.rotate
 | 
			
		||||
 | 
			
		||||
			if p.x > s.x then
 | 
			
		||||
				yaw = yaw + pi
 | 
			
		||||
			end
 | 
			
		||||
			yaw = atan2(vec.z, vec.x) - pi / 2 - self.rotate
 | 
			
		||||
 | 
			
		||||
			self.object:setyaw(yaw)
 | 
			
		||||
 | 
			
		||||
@@ -1652,15 +1654,10 @@ local do_states = function(self, dtime)
 | 
			
		||||
 | 
			
		||||
			local vec = {
 | 
			
		||||
				x = p.x - s.x,
 | 
			
		||||
				y = p.y - s.y,
 | 
			
		||||
				z = p.z - s.z
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate
 | 
			
		||||
 | 
			
		||||
			if p.x > s.x then
 | 
			
		||||
				yaw = yaw + pi
 | 
			
		||||
			end
 | 
			
		||||
			yaw = (atan2(vec.z, vec.x) - pi / 2) - self.rotate
 | 
			
		||||
 | 
			
		||||
			self.object:setyaw(yaw)
 | 
			
		||||
 | 
			
		||||
@@ -1737,7 +1734,11 @@ local do_states = function(self, dtime)
 | 
			
		||||
								})
 | 
			
		||||
							end
 | 
			
		||||
 | 
			
		||||
							-- punch player
 | 
			
		||||
							-- 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}
 | 
			
		||||
@@ -1769,11 +1770,7 @@ local do_states = function(self, dtime)
 | 
			
		||||
				z = p.z - s.z
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate
 | 
			
		||||
 | 
			
		||||
			if p.x > s.x then
 | 
			
		||||
				yaw = yaw + pi
 | 
			
		||||
			end
 | 
			
		||||
			yaw = (atan2(vec.z, vec.x) - pi / 2) - self.rotate
 | 
			
		||||
 | 
			
		||||
			self.object:setyaw(yaw)
 | 
			
		||||
 | 
			
		||||
@@ -1887,12 +1884,12 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
-- is mob protected?
 | 
			
		||||
if self.protected and hitter:is_player()
 | 
			
		||||
and minetest.is_protected(self.object:getpos(), hitter:get_player_name()) then
 | 
			
		||||
	minetest.chat_send_player(hitter:get_player_name(), "Mob has been protected!")
 | 
			
		||||
	return
 | 
			
		||||
end
 | 
			
		||||
	-- is mob protected?
 | 
			
		||||
	if self.protected and hitter:is_player()
 | 
			
		||||
	and minetest.is_protected(self.object:getpos(), hitter:get_player_name()) then
 | 
			
		||||
		minetest.chat_send_player(hitter:get_player_name(), "Mob has been protected!")
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	-- weapon wear
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user