mirror of
				https://codeberg.org/tenplus1/mobs_redo.git
				synced 2025-10-31 07:35:24 +01:00 
			
		
		
		
	supports invisibility, lava/water checks added, code tidied/tweaked
This commit is contained in:
		
							
								
								
									
										144
									
								
								api.lua
									
									
									
									
									
								
							
							
						
						
									
										144
									
								
								api.lua
									
									
									
									
									
								
							| @@ -1,9 +1,13 @@ | ||||
|  | ||||
| -- Mobs Api (7th June 2016) | ||||
| -- Mobs Api (9th June 2016) | ||||
|  | ||||
| mobs = {} | ||||
| mobs.mod = "redo" | ||||
|  | ||||
| -- Invisibility mod | ||||
|  | ||||
| local invisibility = invisibility or {} | ||||
|  | ||||
| -- Load settings | ||||
| local damage_enabled = minetest.setting_getbool("enable_damage") | ||||
| local peaceful_only = minetest.setting_getbool("only_peaceful_mobs") | ||||
| @@ -554,6 +558,10 @@ end | ||||
| -- should mob follow what I'm holding ? | ||||
| function follow_holding(self, clicker) | ||||
|  | ||||
| 	if invisibility[clicker:get_player_name()] then | ||||
| 		return false | ||||
| 	end | ||||
|  | ||||
| 	local item = clicker:get_wielded_item() | ||||
| 	local t = type(self.follow) | ||||
|  | ||||
| @@ -930,8 +938,13 @@ local monster_attack = function(self) | ||||
|  | ||||
| 		if objs[n]:is_player() then | ||||
|  | ||||
| 			player = objs[n] | ||||
| 			type = "player" | ||||
| 			if invisibility[ objs[n]:get_player_name() ] then | ||||
|  | ||||
| 				type = "" | ||||
| 			else | ||||
| 				player = objs[n] | ||||
| 				type = "player" | ||||
| 			end | ||||
| 		else | ||||
| 			obj = objs[n]:get_luaentity() | ||||
|  | ||||
| @@ -1026,8 +1039,11 @@ local follow_flop = function(self) | ||||
|  | ||||
| 		for n = 1, #players do | ||||
|  | ||||
| 			if get_distance(players[n]:getpos(), s) < self.view_range then | ||||
| 			if get_distance(players[n]:getpos(), s) < self.view_range | ||||
| 			and not invisibility[ players[n]:get_player_name() ] then | ||||
|  | ||||
| 				self.following = players[n] | ||||
|  | ||||
| 				break | ||||
| 			end | ||||
| 		end | ||||
| @@ -1083,17 +1099,13 @@ local follow_flop = function(self) | ||||
| 					z = p.z - s.z | ||||
| 				} | ||||
|  | ||||
| --				if vec.x ~= 0 | ||||
| --				and vec.z ~= 0 then | ||||
| 				local yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate | ||||
|  | ||||
| 					yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate | ||||
| 				if p.x > s.x then | ||||
| 					yaw = yaw + pi | ||||
| 				end | ||||
|  | ||||
| 					if p.x > s.x then | ||||
| 						yaw = yaw + pi | ||||
| 					end | ||||
|  | ||||
| 					self.object:setyaw(yaw) | ||||
| --				end | ||||
| 				self.object:setyaw(yaw) | ||||
|  | ||||
| 				-- anyone but standing npc's can move along | ||||
| 				if dist > self.reach | ||||
| @@ -1196,15 +1208,11 @@ local do_states = function(self, dtime) | ||||
| 					z = lp.z - s.z | ||||
| 				} | ||||
|  | ||||
| --				if vec.x ~= 0 | ||||
| --				and vec.z ~= 0 then | ||||
| 				yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate | ||||
|  | ||||
| 					yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate | ||||
|  | ||||
| 					if lp.x > s.x then | ||||
| 						yaw = yaw + pi | ||||
| 					end | ||||
| --				end | ||||
| 				if lp.x > s.x then | ||||
| 					yaw = yaw + pi | ||||
| 				end | ||||
| 			else | ||||
| 				yaw = (random(0, 360) - 180) / 180 * pi | ||||
| 			end | ||||
| @@ -1232,9 +1240,24 @@ local do_states = function(self, dtime) | ||||
| 	elseif self.state == "walk" then | ||||
|  | ||||
| 		local s = self.object:getpos() | ||||
| 		local lp = minetest.find_node_near(s, 1, {"group:water"}) | ||||
| 		local lp = nil | ||||
|  | ||||
| 		-- if water nearby then turn away | ||||
| 		-- is there something I need to avoid? | ||||
| 		if self.water_damage > 0 | ||||
| 		and self.lava_damage > 0 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"}) | ||||
| 		end | ||||
|  | ||||
| 		-- if something then avoid | ||||
| 		if lp then | ||||
|  | ||||
| 			local vec = { | ||||
| @@ -1243,17 +1266,13 @@ local do_states = function(self, dtime) | ||||
| 				z = lp.z - s.z | ||||
| 			} | ||||
|  | ||||
| --			if vec.x ~= 0 | ||||
| --			and vec.z ~= 0 then | ||||
| 			yaw = atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate | ||||
|  | ||||
| 				yaw = atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate | ||||
| 			if lp.x > s.x then | ||||
| 				yaw = yaw + pi | ||||
| 			end | ||||
|  | ||||
| 				if lp.x > s.x then | ||||
| 					yaw = yaw + pi | ||||
| 				end | ||||
|  | ||||
| 				self.object:setyaw(yaw) | ||||
| --			end | ||||
| 			self.object:setyaw(yaw) | ||||
|  | ||||
| 		-- otherwise randomly turn | ||||
| 		elseif random(1, 100) <= 30 then | ||||
| @@ -1345,17 +1364,13 @@ local do_states = function(self, dtime) | ||||
| 				z = p.z - s.z | ||||
| 			} | ||||
|  | ||||
| --			if vec.x ~= 0 | ||||
| --			and vec.z ~= 0 then | ||||
| 			yaw = atan(vec.z / vec.x) + pi / 2 - self.rotate | ||||
|  | ||||
| 				yaw = atan(vec.z / vec.x) + pi / 2 - self.rotate | ||||
| 			if p.x > s.x then | ||||
| 				yaw = yaw + pi | ||||
| 			end | ||||
|  | ||||
| 				if p.x > s.x then | ||||
| 					yaw = yaw + pi | ||||
| 				end | ||||
|  | ||||
| 				self.object:setyaw(yaw) | ||||
| --			end | ||||
| 			self.object:setyaw(yaw) | ||||
|  | ||||
| 			if dist > self.reach then | ||||
|  | ||||
| @@ -1396,7 +1411,6 @@ local do_states = function(self, dtime) | ||||
| 						self.object:settexturemod("") | ||||
| 					else | ||||
| 						self.object:settexturemod("^[brighten") | ||||
| 						--self.object:settexturemod("^[colorize:#ff880070") | ||||
| 					end | ||||
|  | ||||
| 					self.blinkstatus = not self.blinkstatus | ||||
| @@ -1527,17 +1541,13 @@ local do_states = function(self, dtime) | ||||
| 				z = p.z - s.z | ||||
| 			} | ||||
|  | ||||
| --			if vec.x ~= 0 | ||||
| --			and vec.z ~= 0 then | ||||
| 			yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate | ||||
|  | ||||
| 				yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate | ||||
| 			if p.x > s.x then | ||||
| 				yaw = yaw + pi | ||||
| 			end | ||||
|  | ||||
| 				if p.x > s.x then | ||||
| 					yaw = yaw + pi | ||||
| 				end | ||||
|  | ||||
| 				self.object:setyaw(yaw) | ||||
| --			end | ||||
| 			self.object:setyaw(yaw) | ||||
|  | ||||
| 			-- move towards enemy if beyond mob reach | ||||
| 			if dist > self.reach then | ||||
| @@ -1645,17 +1655,13 @@ local do_states = function(self, dtime) | ||||
| 				z = p.z - s.z | ||||
| 			} | ||||
|  | ||||
| --			if vec.x ~= 0 | ||||
| --			and vec.z ~= 0 then | ||||
| 			yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate | ||||
|  | ||||
| 				yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate | ||||
| 			if p.x > s.x then | ||||
| 				yaw = yaw + pi | ||||
| 			end | ||||
|  | ||||
| 				if p.x > s.x then | ||||
| 					yaw = yaw + pi | ||||
| 				end | ||||
|  | ||||
| 				self.object:setyaw(yaw) | ||||
| --			end | ||||
| 			self.object:setyaw(yaw) | ||||
|  | ||||
| 			set_velocity(self, 0) | ||||
|  | ||||
| @@ -1901,18 +1907,13 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) | ||||
| 			z = lp.z - s.z | ||||
| 		} | ||||
|  | ||||
| --		if vec.x ~= 0 | ||||
| --		and vec.z ~= 0 then | ||||
| 		local yaw = atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate | ||||
|  | ||||
| 			local yaw = atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate | ||||
|  | ||||
| 			if lp.x > s.x then | ||||
| 				yaw = yaw + pi | ||||
| 			end | ||||
|  | ||||
| 			self.object:setyaw(yaw) | ||||
| --		end | ||||
| 		if lp.x > s.x then | ||||
| 			yaw = yaw + pi | ||||
| 		end | ||||
|  | ||||
| 		self.object:setyaw(yaw) | ||||
| 		self.state = "runaway" | ||||
| 		self.runaway_timer = 0 | ||||
| 		self.following = nil | ||||
| @@ -1922,7 +1923,8 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) | ||||
| 	if self.passive == false | ||||
| 	and self.state ~= "flop" | ||||
| 	and self.child == false | ||||
| 	and hitter:get_player_name() ~= self.owner then | ||||
| 	and hitter:get_player_name() ~= self.owner | ||||
| 	and not invisibility[ hitter:get_player_name() ] then | ||||
|  | ||||
| 		-- attack whoever punched mob | ||||
| 		self.state = "" | ||||
|   | ||||
| @@ -1 +1,2 @@ | ||||
| default | ||||
| invisibility? | ||||
|   | ||||
		Reference in New Issue
	
	Block a user