mirror of
				https://codeberg.org/tenplus1/mobs_redo.git
				synced 2025-10-31 15:45:22 +01:00 
			
		
		
		
	Compare commits
	
		
			54 Commits
		
	
	
		
			10e4dd92a0
			...
			ca34cc2274
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | ca34cc2274 | ||
|  | 168014b86f | ||
|  | 6f8b6fe3f5 | ||
|  | dd16d63e8e | ||
|  | 7bb5e2b382 | ||
|  | 7b429df9e9 | ||
|  | 0e72f0ca81 | ||
|  | fb42be6b28 | ||
|  | f54c3da9d7 | ||
|  | 65e369e5fc | ||
|  | 9f74408792 | ||
|  | 18c7f0a422 | ||
|  | 2fb7bf2c66 | ||
|  | f01e8a61d0 | ||
|  | b756aa50f5 | ||
|  | e83620553d | ||
|  | e5d1958e16 | ||
|  | 6a4a02f3fb | ||
|  | 5d88766b74 | ||
|  | d31da2d069 | ||
|  | 00db86c924 | ||
|  | 26ec61ee29 | ||
|  | a8ca00dc56 | ||
|  | 4c80a55c04 | ||
|  | deee28fc59 | ||
|  | ab44080ff8 | ||
|  | 9f46182bb4 | ||
|  | 2535b5636e | ||
|  | 2d014a75c4 | ||
|  | db3831dccf | ||
|  | 29b2204f7c | ||
|  | 7fbfd9d59c | ||
|  | e50d04a6aa | ||
|  | 33589ebda0 | ||
|  | 6670938c3d | ||
|  | f131806008 | ||
|  | 49325c9c8d | ||
|  | 8012250258 | ||
|  | ec44aa91c4 | ||
|  | f58841ab3e | ||
|  | 350fc3647c | ||
|  | 70c68f6ebc | ||
|  | c023ecc36f | ||
|  | 9be934ec25 | ||
|  | f6e16a5503 | ||
|  | c06d071220 | ||
|  | ccbfe93f12 | ||
|  | 6750d176ee | ||
|  | 246b2769f7 | ||
|  | 34b06df758 | ||
|  | 0f1f3b4fb3 | ||
|  | 774ce6671f | ||
|  | 11e1d52cfb | ||
|  | c158e84e28 | 
							
								
								
									
										26
									
								
								api.txt
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								api.txt
									
									
									
									
									
								
							| @@ -56,6 +56,8 @@ functions needed for the mob to work properly which contains the following: | ||||
|    'view_range'    how many nodes in distance the mob can see a player. | ||||
|    'damage'        how many health points the mob does to a player or another | ||||
|                    mob when melee attacking. | ||||
|    'damage_group'  group in which damage is dealt, dedaults to "fleshy". | ||||
|    'damage_texture_modifier' applies texture modifier on hit e.g "^[brighten" | ||||
|    'knock_back'    when true has mobs falling backwards when hit, the greater | ||||
|                    the damage the more they move back. | ||||
|    'fear_height'   is how high a cliff or edge has to be before the mob stops | ||||
| @@ -66,7 +68,10 @@ functions needed for the mob to work properly which contains the following: | ||||
|                    water. | ||||
|    'air_damage'    holds damage per second inflicted to mob when standing in air. | ||||
|    'lava_damage'   holds the damage per second inflicted to mobs when standing | ||||
|                    in lava or fire or an ignition source. | ||||
|                    in lava. | ||||
|    'fire_damage'   holds the damage per second inflicted to mobs when standing | ||||
|                    in fire. | ||||
|  | ||||
|    'light_damage'  holds the damage per second inflicted to mobs when light | ||||
|                    level is between the min and max values below | ||||
|    'light_damage_min' minimum light value when mob is affected (default: 14) | ||||
| @@ -76,7 +81,7 @@ functions needed for the mob to work properly which contains the following: | ||||
|    'floats'        when set to 1 mob will float in water, 0 has them sink. | ||||
|    'follow'        mobs follow player when holding any of the items which appear | ||||
|                    on this table, the same items can be fed to a mob to tame or | ||||
|                    breed e.g. {"farming:wheat", "default:apple"} | ||||
|                    breed e.g. {"farming:wheat", "default:apple", "group:fish"} | ||||
|  | ||||
|    'reach'               is how far the mob can attack player when standing | ||||
|                          nearby, default is 3 nodes. | ||||
| @@ -118,6 +123,8 @@ functions needed for the mob to work properly which contains the following: | ||||
|                          continue chasing. | ||||
|    'arrow'               holds the pre-defined arrow object to shoot when | ||||
|                          attacking. | ||||
|    'arrow_override'      function that allows tweaking of arrow entity from | ||||
|                          inside mob definition (self) passed to function. | ||||
|    'dogshoot_switch'     allows switching between attack types by using timers | ||||
|                          (1 for shoot, 2 for dogfight) | ||||
|    'dogshoot_count_max'  contains how many seconds before switching from | ||||
| @@ -131,6 +138,8 @@ functions needed for the mob to work properly which contains the following: | ||||
|                          e.g. {"player", "mobs_animal:chicken"}. | ||||
|    'runaway_from'        contains a table with mob names to run away from, add | ||||
|                          "player" to list to runaway from player also. | ||||
|    'ignore_invisibility' When true mob will still be able to see and attack | ||||
|                          player even if invisible (invisibility mod only). | ||||
|    'blood_amount'        contains the number of blood droplets to appear when | ||||
|                          mob is hit. | ||||
|    'blood_texture'       has the texture name to use for droplets e.g. | ||||
| @@ -406,7 +415,7 @@ the mobs:spawn, so it is recommended to use the above instead. | ||||
| mobs:register_spawn(name, nodes, max_light, min_light, chance, | ||||
|    active_object_count, max_height, day_toggle) | ||||
|  | ||||
| mobs:spawn_specfic(name, nodes, neighbors, min_light, max_light, interval, | ||||
| mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, | ||||
|    chance, active_object_count, min_height, max_height, day_toggle, on_spawn) | ||||
|  | ||||
| A simpler way to handle mob spawns has been added with the mobs:spawn(def) | ||||
| @@ -460,6 +469,8 @@ This function registers a arrow for mobs with the attack type shoot. | ||||
|        'visual'       same is in minetest.register_entity() | ||||
|        'visual_size'  same is in minetest.register_entity() | ||||
|        'textures'     same is in minetest.register_entity() | ||||
|        'physical'     same is in minetest.register_entity() [default: false] | ||||
|        'collide_with_objects'       same as above | ||||
|        'velocity'     the velocity of the arrow | ||||
|        'drop'         if set to true any arrows hitting a node will drop as item | ||||
|        'hit_player'   a function that is called when the arrow hits a player; | ||||
| @@ -680,6 +691,12 @@ space to spawn mob [name], if so then a new position is returned for use, | ||||
| otherwise nil is returned. | ||||
|  | ||||
|  | ||||
| mobs:is_node_dangerous(mob_object, nodename) | ||||
|  | ||||
| This function returns true if the node name given is harmful to the mob (mob_object), | ||||
| it is mainly used when a mob is near a node it has to avoid. | ||||
|  | ||||
|  | ||||
| External Settings for "minetest.conf" | ||||
| ------------------------------------ | ||||
|  | ||||
| @@ -690,6 +707,8 @@ External Settings for "minetest.conf" | ||||
|                             is false) | ||||
|    'mobs_spawn_protected'   if set to false then mobs will not spawn in protected | ||||
|                             areas (default is true) | ||||
|    'mobs_spawn_monster_protected'   if set to false then monsters will not spawn in | ||||
|                             protected areas (default is true) | ||||
|    'remove_far_mobs'        if true then untamed mobs that are outside players | ||||
|                              visual range will be removed (default is true) | ||||
|    'mobname'                can change specific mob chance rate (0 to disable) and | ||||
| @@ -713,6 +732,7 @@ External Settings for "minetest.conf" | ||||
|    'mob_area_spawn'         When true will check surrounding area the size of the | ||||
|                             mob for obstructions before spawning, otherwise it | ||||
|                             defaults to checking the height of the mob only. | ||||
|    'mob_smooth_rotate'      Enables smooth rotation when mobs turn by default. | ||||
|  | ||||
| Players can override the spawn chance for each mob registered by adding a line | ||||
| to their minetest.conf file with a new value, the lower the value the more each | ||||
|   | ||||
							
								
								
									
										46
									
								
								crafts.lua
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								crafts.lua
									
									
									
									
									
								
							| @@ -10,9 +10,8 @@ minetest.register_craftitem("mobs:nametag", { | ||||
|  | ||||
| if minetest.get_modpath("dye") and minetest.get_modpath("farming") then | ||||
| 	minetest.register_craft({ | ||||
| 		type = "shapeless", | ||||
| 		output = "mobs:nametag", | ||||
| 		recipe = {"default:paper", "dye:black", "farming:string"} | ||||
| 		recipe = {{"default:paper", "dye:black", "farming:string"}} | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| @@ -115,6 +114,22 @@ minetest.register_craft({ | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| -- level 2 protection rune | ||||
| minetest.register_craftitem("mobs:protector2", { | ||||
| 	description = S("Mob Protection Rune (Level 2)"), | ||||
| 	inventory_image = "mobs_protector2.png", | ||||
| 	groups = {flammable = 2} | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = "mobs:protector2", | ||||
| 	recipe = { | ||||
| 		{"mobs:protector", "default:mese_crystal", "mobs:protector"}, | ||||
| 		{"default:mese_crystal", "default:diamondblock", "default:mese_crystal"}, | ||||
| 		{"mobs:protector", "default:mese_crystal", "mobs:protector"} | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| -- saddle | ||||
| minetest.register_craftitem("mobs:saddle", { | ||||
| 	description = S("Saddle"), | ||||
| @@ -133,7 +148,7 @@ minetest.register_craft({ | ||||
|  | ||||
|  | ||||
| -- make sure we can register fences | ||||
| if default.register_fence then | ||||
| if minetest.get_modpath("default") and default.register_fence then | ||||
|  | ||||
| -- mob fence (looks like normal fence but collision is 2 high) | ||||
| default.register_fence("mobs:fence_wood", { | ||||
| @@ -149,6 +164,7 @@ default.register_fence("mobs:fence_wood", { | ||||
| 		} | ||||
| 	} | ||||
| }) | ||||
| end | ||||
|  | ||||
| -- mob fence top (has enlarged collisionbox to stop mobs getting over) | ||||
| minetest.register_node("mobs:fence_top", { | ||||
| @@ -181,8 +197,6 @@ minetest.register_craft({ | ||||
| 	} | ||||
| }) | ||||
|  | ||||
| end | ||||
|  | ||||
|  | ||||
| -- items that can be used as fuel | ||||
| minetest.register_craft({ | ||||
| @@ -283,12 +297,18 @@ minetest.register_tool(":mobs:mob_reset_stick", { | ||||
|  | ||||
| 			tex_obj = obj | ||||
|  | ||||
| 			-- get base texture | ||||
| 			local bt = tex_obj:get_luaentity().base_texture[1] | ||||
|  | ||||
| 			if type(bt) ~= "string" then | ||||
| 				bt = "" | ||||
| 			end | ||||
|  | ||||
| 			local name = user:get_player_name() | ||||
| 			local tex = "" | ||||
|  | ||||
| 			minetest.show_formspec(name, "mobs_texture", "size[8,4]" | ||||
| 			.. "field[0.5,1;7.5,0;name;" | ||||
| 			.. minetest.formspec_escape(S("Enter texture:")) .. ";" .. tex .. "]" | ||||
| 			.. minetest.formspec_escape(S("Enter texture:")) .. ";" .. bt .. "]" | ||||
| 			.. "button_exit[2.5,3.5;3,1;mob_texture_change;" | ||||
| 			.. minetest.formspec_escape(S("Change")) .. "]") | ||||
| 		end | ||||
| @@ -339,17 +359,17 @@ minetest.register_node("mobs:meatblock", { | ||||
| 	tiles = {"mobs_meat_top.png", "mobs_meat_bottom.png", "mobs_meat_side.png"}, | ||||
| 	paramtype2 = "facedir", | ||||
| 	groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2}, | ||||
| 	sounds = default.node_sound_leaves_defaults(), | ||||
| 	sounds = default and default.node_sound_leaves_defaults(), | ||||
| 	on_place = minetest.rotate_node, | ||||
| 	on_use = minetest.item_eat(20), | ||||
| 	on_use = minetest.item_eat(20) | ||||
| }) | ||||
|  | ||||
| minetest.register_craft({ | ||||
| 	output = "mobs:meatblock", | ||||
| 	type = "shapeless", | ||||
| --	type = "shapeless", | ||||
| 	recipe = { | ||||
| 		"group:food_meat", "group:food_meat", "group:food_meat", | ||||
| 		"group:food_meat", "group:food_meat", "group:food_meat", | ||||
| 		"group:food_meat", "group:food_meat", "group:food_meat" | ||||
| 		{"group:food_meat", "group:food_meat", "group:food_meat"}, | ||||
| 		{"group:food_meat", "group:food_meat", "group:food_meat"}, | ||||
| 		{"group:food_meat", "group:food_meat", "group:food_meat"} | ||||
| 	} | ||||
| }) | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| default | ||||
| default? | ||||
| tnt? | ||||
| dye? | ||||
| farming? | ||||
| @@ -7,3 +7,5 @@ intllib? | ||||
| lucky_block? | ||||
| cmi? | ||||
| toolranks? | ||||
| pathfinder? | ||||
| player_api? | ||||
|   | ||||
							
								
								
									
										2
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								init.lua
									
									
									
									
									
								
							| @@ -22,4 +22,4 @@ dofile(path .. "/spawner.lua") | ||||
| -- Lucky Blocks | ||||
| dofile(path .. "/lucky_block.lua") | ||||
|  | ||||
| minetest.log("action", "[MOD] Mobs Redo loaded") | ||||
| print("[MOD] Mobs Redo loaded") | ||||
|   | ||||
| @@ -1,3 +0,0 @@ | ||||
| -- Support for the old multi-load method | ||||
| dofile(minetest.get_modpath("intllib").."/init.lua") | ||||
|  | ||||
| @@ -11,7 +11,7 @@ msgstr "" | ||||
| "PO-Revision-Date: 2017-07-02 14:27+0200\n" | ||||
| "Last-Translator: Wuzzy <almikes@aol.com>\n" | ||||
| "Language-Team: \n" | ||||
| "Language: de_DE\n" | ||||
| "Language: de\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
|   | ||||
							
								
								
									
										4
									
								
								mod.conf
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								mod.conf
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| name = mobs | ||||
| depends = default | ||||
| optional_depends = tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks | ||||
| depends = | ||||
| optional_depends = default, tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks, pathfinder, player_api | ||||
| description = Adds a mob api for mods to add animals or monsters etc. | ||||
|   | ||||
							
								
								
									
										131
									
								
								mount.lua
									
									
									
									
									
								
							
							
						
						
									
										131
									
								
								mount.lua
									
									
									
									
									
								
							| @@ -1,14 +1,16 @@ | ||||
| -- lib_mount by Blert2112 (edited by TenPlus1) | ||||
|  | ||||
| local is_50 = minetest.get_modpath("player_api") -- 5.x compatibility | ||||
|  | ||||
| local abs, cos, floor, sin, sqrt, pi = | ||||
| 		math.abs, math.cos, math.floor, math.sin, math.sqrt, math.pi | ||||
| ------------------------------------------------------------------------------ | ||||
|  | ||||
| -- | ||||
| -- Helper functions | ||||
| -- | ||||
|  | ||||
| local node_ok = function(pos, fallback) | ||||
|  | ||||
| 	fallback = fallback or mobs.fallback_node | ||||
|  | ||||
| 	local node = minetest.get_node_or_nil(pos) | ||||
| @@ -22,6 +24,7 @@ end | ||||
|  | ||||
|  | ||||
| local function node_is(pos) | ||||
|  | ||||
| 	local node = node_ok(pos) | ||||
|  | ||||
| 	if node.name == "air" then | ||||
| @@ -45,6 +48,7 @@ end | ||||
|  | ||||
|  | ||||
| local function get_sign(i) | ||||
|  | ||||
| 	i = i or 0 | ||||
|  | ||||
| 	if i == 0 then | ||||
| @@ -56,6 +60,7 @@ end | ||||
|  | ||||
|  | ||||
| local function get_velocity(v, yaw, y) | ||||
|  | ||||
| 	local x = -sin(yaw) * v | ||||
| 	local z =  cos(yaw) * v | ||||
|  | ||||
| @@ -69,6 +74,9 @@ end | ||||
|  | ||||
|  | ||||
| local function force_detach(player) | ||||
|  | ||||
| 	if not player then return end | ||||
|  | ||||
| 	local attached_to = player:get_attach() | ||||
|  | ||||
| 	if not attached_to then | ||||
| @@ -83,35 +91,46 @@ local function force_detach(player) | ||||
| 	end | ||||
|  | ||||
| 	player:set_detach() | ||||
| 	player_api.player_attached[player:get_player_name()] = false | ||||
| 	player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) | ||||
| 	player_api.set_animation(player, "stand", 30) | ||||
| 	player:set_properties({visual_size = {x = 1, y = 1}}) | ||||
|  | ||||
| 	local name = player:get_player_name() | ||||
|  | ||||
| 	if is_50 then | ||||
| 		player_api.player_attached[name] = false | ||||
| 		player_api.set_animation(player, "stand", 30) | ||||
| 	else | ||||
| 		default.player_attached[name] = false | ||||
| 		default.player_set_animation(player, "stand", 30) | ||||
| 	end | ||||
|  | ||||
| 	player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) | ||||
| 	player:set_properties({visual_size = {x = 1, y = 1}}) | ||||
| end | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
|  | ||||
| minetest.register_on_leaveplayer(function(player) | ||||
| 	force_detach(player) | ||||
| end) | ||||
|  | ||||
|  | ||||
| minetest.register_on_shutdown(function() | ||||
|  | ||||
| 	local players = minetest.get_connected_players() | ||||
|  | ||||
| 	for i = 1, #players do | ||||
| 		force_detach(players[i]) | ||||
| 	end | ||||
| end) | ||||
|  | ||||
|  | ||||
| minetest.register_on_dieplayer(function(player) | ||||
| 	force_detach(player) | ||||
| 	return true | ||||
| end) | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
|  | ||||
| -- Just for correct detaching | ||||
| local function find_free_pos(pos) | ||||
|  | ||||
| 	local check = { | ||||
| 		{x = 1,  y = 0, z =  0}, | ||||
| 		{x = 1,  y = 1, z =  0}, | ||||
| @@ -124,10 +143,14 @@ local function find_free_pos(pos) | ||||
| 	} | ||||
|  | ||||
| 	for _, c in pairs(check) do | ||||
|  | ||||
| 		local npos = {x = pos.x + c.x, y = pos.y + c.y, z = pos.z + c.z} | ||||
| 		local node = minetest.get_node_or_nil(npos) | ||||
|  | ||||
| 		if node and node.name then | ||||
|  | ||||
| 			local def = minetest.registered_nodes[node.name] | ||||
|  | ||||
| 			if def and not def.walkable and | ||||
| 					def.liquidtype == "none" then | ||||
| 				return npos | ||||
| @@ -138,9 +161,9 @@ local function find_free_pos(pos) | ||||
| 	return pos | ||||
| end | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
|  | ||||
| function mobs.attach(entity, player) | ||||
|  | ||||
| 	entity.player_rotation = entity.player_rotation or {x = 0, y = 0, z = 0} | ||||
| 	entity.driver_attach_at = entity.driver_attach_at or {x = 0, y = 0, z = 0} | ||||
| 	entity.driver_eye_offset = entity.driver_eye_offset or {x = 0, y = 0, z = 0} | ||||
| @@ -154,12 +177,18 @@ function mobs.attach(entity, player) | ||||
|  | ||||
| 	local attach_at = entity.driver_attach_at | ||||
| 	local eye_offset = entity.driver_eye_offset | ||||
|  | ||||
| 	entity.driver = player | ||||
|  | ||||
| 	force_detach(player) | ||||
|  | ||||
| 	if is_50 then | ||||
| 		player_api.player_attached[player:get_player_name()] = true | ||||
| 	else | ||||
| 		default.player_attached[player:get_player_name()] = true | ||||
| 	end | ||||
|  | ||||
| 	player:set_attach(entity.object, "", attach_at, entity.player_rotation) | ||||
| 	player_api.player_attached[player:get_player_name()] = true | ||||
| 	player:set_eye_offset(eye_offset, {x = 0, y = 0, z = 0}) | ||||
|  | ||||
| 	player:set_properties({ | ||||
| @@ -170,8 +199,14 @@ function mobs.attach(entity, player) | ||||
| 	}) | ||||
|  | ||||
| 	minetest.after(0.2, function() | ||||
|  | ||||
| 		if player and player:is_player() then | ||||
| 			player_api.set_animation(player, "sit", 30) | ||||
|  | ||||
| 			if is_50 then | ||||
| 				player_api.set_animation(player, "sit", 30) | ||||
| 			else | ||||
| 				default.player_set_animation(player, "sit", 30) | ||||
| 			end | ||||
| 		end | ||||
| 	end) | ||||
|  | ||||
| @@ -180,12 +215,17 @@ end | ||||
|  | ||||
|  | ||||
| function mobs.detach(player) | ||||
|  | ||||
| 	force_detach(player) | ||||
|  | ||||
| 	minetest.after(0.1, function() | ||||
|  | ||||
| 		if player and player:is_player() then | ||||
|  | ||||
| 			local pos = find_free_pos(player:get_pos()) | ||||
|  | ||||
| 			pos.y = pos.y + 0.5 | ||||
|  | ||||
| 			player:set_pos(pos) | ||||
| 		end | ||||
| 	end) | ||||
| @@ -193,8 +233,8 @@ end | ||||
|  | ||||
|  | ||||
| function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | ||||
| 	local yaw = entity.object:get_yaw() or 0 | ||||
|  | ||||
| 	local yaw = entity.object:get_yaw() or 0 | ||||
| 	local rot_view = 0 | ||||
|  | ||||
| 	if entity.player_rotation.y == 90 then | ||||
| @@ -202,30 +242,35 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | ||||
| 	end | ||||
|  | ||||
| 	local acce_y = 0 | ||||
| 	local velo = entity.object:get_velocity() | ||||
| 	local velo = entity.object:get_velocity() ; if not velo then return end | ||||
|  | ||||
| 	entity.v = get_v(velo) * get_sign(entity.v) | ||||
|  | ||||
| 	-- process controls | ||||
| 	if entity.driver then | ||||
|  | ||||
| 		local ctrl = entity.driver:get_player_control() | ||||
|  | ||||
| 		-- move forwards | ||||
| 		if ctrl.up then | ||||
| 			entity.v = entity.v + entity.accel / 10 | ||||
|  | ||||
| 			entity.v = entity.v + entity.accel * dtime | ||||
|  | ||||
| 		-- move backwards | ||||
| 		elseif ctrl.down then | ||||
|  | ||||
| 			if entity.max_speed_reverse == 0 and entity.v == 0 then | ||||
| 				return | ||||
| 			end | ||||
|  | ||||
| 			entity.v = entity.v - entity.accel / 10 | ||||
| 			entity.v = entity.v - entity.accel * dtime | ||||
| 		end | ||||
|  | ||||
| 		-- mob rotation | ||||
| 		local horz | ||||
|  | ||||
| 		if entity.alt_turn == true then | ||||
|  | ||||
| 			horz = yaw | ||||
|  | ||||
| 			if ctrl.left then | ||||
| @@ -241,23 +286,32 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | ||||
| 		entity.object:set_yaw(horz - entity.rotate) | ||||
|  | ||||
| 		if can_fly then | ||||
|  | ||||
| 			-- fly up | ||||
| 			if ctrl.jump then | ||||
|  | ||||
| 				velo.y = velo.y + 1 | ||||
|  | ||||
| 				if velo.y > entity.accel then velo.y = entity.accel end | ||||
|  | ||||
| 			elseif velo.y > 0 then | ||||
| 				velo.y = velo.y - 0.1 | ||||
|  | ||||
| 				velo.y = velo.y - dtime | ||||
|  | ||||
| 				if velo.y < 0 then velo.y = 0 end | ||||
| 			end | ||||
|  | ||||
| 			-- fly down | ||||
| 			if ctrl.sneak then | ||||
|  | ||||
| 				velo.y = velo.y - 1 | ||||
|  | ||||
| 				if velo.y < -entity.accel then velo.y = -entity.accel end | ||||
|  | ||||
| 			elseif velo.y < 0 then | ||||
| 				velo.y = velo.y + 0.1 | ||||
|  | ||||
| 				velo.y = velo.y + dtime | ||||
|  | ||||
| 				if velo.y > 0 then velo.y = 0 end | ||||
| 			end | ||||
| 		else | ||||
| @@ -274,6 +328,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | ||||
|  | ||||
| 	-- if not moving then set animation and return | ||||
| 	if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then | ||||
|  | ||||
| 		if stand_anim then | ||||
| 			mobs:set_animation(entity, stand_anim) | ||||
| 		end | ||||
| @@ -292,27 +347,26 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | ||||
| 	entity.v = entity.v - 0.02 * s | ||||
|  | ||||
| 	if s ~= get_sign(entity.v) then | ||||
|  | ||||
| 		entity.object:set_velocity({x = 0, y = 0, z = 0}) | ||||
| 		entity.v = 0 | ||||
|  | ||||
| 		return | ||||
| 	end | ||||
|  | ||||
| 	-- enforce speed limit forward and reverse | ||||
| 	local max_spd = entity.max_speed_reverse | ||||
|  | ||||
| 	if get_sign(entity.v) >= 0 then | ||||
| 		max_spd = entity.max_speed_forward | ||||
| 	end | ||||
|  | ||||
| 	if abs(entity.v) > max_spd then | ||||
| 		entity.v = entity.v - get_sign(entity.v) | ||||
| 	if entity.v > entity.max_speed_forward then | ||||
| 		entity.v = entity.max_speed_forward | ||||
| 	elseif entity.v < -entity.max_speed_reverse then | ||||
| 		entity.v = -entity.max_speed_reverse | ||||
| 	end | ||||
|  | ||||
| 	-- Set position, velocity and acceleration | ||||
| 	local p = entity.object:get_pos() | ||||
|  | ||||
| 	if not p then return end | ||||
|  | ||||
| 	local new_acce = {x = 0, y = -9.81, z = 0} | ||||
| 	local new_acce = {x = 0, y = entity.fall_speed, z = 0} | ||||
|  | ||||
| 	p.y = p.y - 0.5 | ||||
|  | ||||
| @@ -320,18 +374,23 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | ||||
| 	local v = entity.v | ||||
|  | ||||
| 	if ni == "air" then | ||||
|  | ||||
| 		if can_fly == true then | ||||
| 			new_acce.y = 0 | ||||
| 		end | ||||
|  | ||||
| 	elseif ni == "liquid" or ni == "lava" then | ||||
|  | ||||
| 		if ni == "lava" and entity.lava_damage ~= 0 then | ||||
|  | ||||
| 			entity.lava_counter = (entity.lava_counter or 0) + dtime | ||||
|  | ||||
| 			if entity.lava_counter > 1 then | ||||
|  | ||||
| 				minetest.sound_play("default_punch", { | ||||
| 					object = entity.object, | ||||
| 					max_hear_distance = 5 | ||||
| 				}) | ||||
| 				}, true) | ||||
|  | ||||
| 				entity.object:punch(entity.object, 1.0, { | ||||
| 					full_punch_interval = 1.0, | ||||
| @@ -343,11 +402,14 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | ||||
| 		end | ||||
|  | ||||
| 		local terrain_type = entity.terrain_type | ||||
|  | ||||
| 		if terrain_type == 2 or terrain_type == 3 then | ||||
|  | ||||
| 			new_acce.y = 0 | ||||
| 			p.y = p.y + 1 | ||||
|  | ||||
| 			if node_is(p) == "liquid" then | ||||
|  | ||||
| 				if velo.y >= 5 then | ||||
| 					velo.y = 5 | ||||
| 				elseif velo.y < 0 then | ||||
| @@ -357,7 +419,9 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | ||||
| 				end | ||||
| 			else | ||||
| 				if abs(velo.y) < 1 then | ||||
|  | ||||
| 					local pos = entity.object:get_pos() | ||||
|  | ||||
| 					if not pos then return end | ||||
|  | ||||
| 					pos.y = floor(pos.y) + 0.5 | ||||
| @@ -371,6 +435,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | ||||
| 	end | ||||
|  | ||||
| 	local new_velo = get_velocity(v, yaw - rot_view, velo.y) | ||||
|  | ||||
| 	new_acce.y = new_acce.y + acce_y | ||||
|  | ||||
| 	entity.object:set_velocity(new_velo) | ||||
| @@ -382,12 +447,16 @@ end | ||||
|  | ||||
| -- directional flying routine by D00Med (edited by TenPlus1) | ||||
| function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim) | ||||
| 	local ctrl = entity.driver:get_player_control() | ||||
|  | ||||
| 	local ctrl = entity.driver:get_player_control() ; if not ctrl then return end | ||||
| 	local velo = entity.object:get_velocity() | ||||
| 	local dir = entity.driver:get_look_dir() | ||||
| 	local yaw = entity.driver:get_look_horizontal() + 1.57 -- offset fix between old and new commands | ||||
| 	local yaw = entity.driver:get_look_horizontal() + 1.57 | ||||
|  | ||||
| 	if not ctrl or not velo then return end | ||||
|  | ||||
| 	if ctrl.up then | ||||
|  | ||||
| 		entity.object:set_velocity({ | ||||
| 			x = dir.x * speed, | ||||
| 			y = dir.y * speed + 2, | ||||
| @@ -395,6 +464,7 @@ function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim) | ||||
| 		}) | ||||
|  | ||||
| 	elseif ctrl.down then | ||||
|  | ||||
| 		entity.object:set_velocity({ | ||||
| 			x = -dir.x * speed, | ||||
| 			y =  dir.y * speed + 2, | ||||
| @@ -409,6 +479,7 @@ function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim) | ||||
|  | ||||
| 	-- firing arrows | ||||
| 	if ctrl.LMB and ctrl.sneak and shoots then | ||||
|  | ||||
| 		local pos = entity.object:get_pos() | ||||
| 		local obj = minetest.add_entity({ | ||||
| 			x = pos.x + 0 + dir.x * 2.5, | ||||
| @@ -416,11 +487,15 @@ function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim) | ||||
| 			z = pos.z + 0 + dir.z * 2.5}, arrow) | ||||
|  | ||||
| 		local ent = obj:get_luaentity() | ||||
|  | ||||
| 		if ent then | ||||
|  | ||||
| 			ent.switch = 1 -- for mob specific arrows | ||||
| 			ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding | ||||
| 			local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6} | ||||
|  | ||||
| 			yaw = entity.driver:get_look_horizontal() | ||||
|  | ||||
| 			obj:set_yaw(yaw + pi / 2) | ||||
| 			obj:set_velocity(vec) | ||||
| 		else | ||||
|   | ||||
| @@ -23,7 +23,8 @@ Lucky Blocks: 9 | ||||
|  | ||||
|  | ||||
| Changelog: | ||||
| - 1.55 - Add 'peaceful_player' privelage and setting so mobs don't attack specific players (thanks sfence) | ||||
| - 1.56 - Added arrow_override function to mob definition to tweak arrow entity settings, tamed monsters no longer despawn when outside loaded map area. | ||||
| - 1.55 - Add 'peaceful_player' privelage and setting so mobs don't attack specific players (thanks sfence), add support for MarkBu's pathfinder mod, remove need for default mod | ||||
| - 1.54 - Simplified animal breeding function, added editable settings (thanks Wuzzy), Child mobs now take 20 mins to grow up, reverted to simple mob spawning with setting to use area checks, on_flop added, air_damage added. | ||||
| - 1.53 - Added 'on_map_load' settings to mobs:spawn so that mobs will only spawn when new areas of map are loaded. | ||||
| - 1.52 - Added 'mob_active_limit' in settings to set number of mobs in game, | ||||
|   | ||||
| @@ -13,6 +13,9 @@ mobs_griefing (Griefing Mobs) bool true | ||||
| #    If false then Mobs no longer spawn inside player protected areas | ||||
| mobs_spawn_protected (Spawn Mobs in protected areas) bool true | ||||
|  | ||||
| #    If false then Monsters no longer spawn inside player protected areas | ||||
| mobs_spawn_monster_protected (Spawn Monsters in protected areas) bool true | ||||
|  | ||||
| #    If true Mobs will be removed once a map chunk is out of view | ||||
| remove_far_mobs (Remove far Mobs) bool true | ||||
|  | ||||
| @@ -39,3 +42,6 @@ mob_area_spawn (Mob Area Spawn) bool false | ||||
|  | ||||
| #    Enable peaceful player attack prevention | ||||
| enable_peaceful_player (Mobs do not attack peaceful player without reason) bool false | ||||
|  | ||||
| #    Enable mobs smooth rotation | ||||
| mob_smooth_rotate (Smooth rotation for mobs) bool true | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								textures/mobs_protector2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								textures/mobs_protector2.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 164 B | 
		Reference in New Issue
	
	Block a user