mirror of
				https://codeberg.org/tenplus1/mobs_redo.git
				synced 2025-10-31 23:55:22 +01:00 
			
		
		
		
	Compare commits
	
		
			89 Commits
		
	
	
		
			469e35d6e0
			...
			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 | ||
|  | 10e4dd92a0 | ||
|  | 10053e05a9 | ||
|  | 425cadeb51 | ||
|  | 2d1befacb3 | ||
|  | ad2ccc5895 | ||
|  | 754321541a | ||
|  | 622abd1486 | ||
|  | 55eb893a9a | ||
|  | 76ee3d0b51 | ||
|  | 00ac9efc8c | ||
|  | bf32a09e5e | ||
|  | 9489ff6965 | ||
|  | 1dfd7e1af1 | ||
|  | 4a6518eeba | ||
|  | a4d2918383 | ||
|  | bdea826b7c | ||
|  | d12576f0c8 | ||
|  | 7f4d473fee | ||
|  | f7a1b27ea4 | ||
|  | f14050ad3c | ||
|  | b6fb1948e8 | ||
|  | 67e4ede31b | ||
|  | 3009da0efe | ||
|  | bd8be0905a | ||
|  | 89523195d5 | ||
|  | c6dffd1390 | ||
|  | 499d43a9aa | ||
|  | 39002cf4e7 | ||
|  | 477148962f | ||
|  | 497ff7241f | ||
|  | 9f02777f14 | ||
|  | ae62b1410d | ||
|  | 81b5e40d09 | ||
|  | 565c0851eb | ||
|  | cb465559a1 | 
							
								
								
									
										68
									
								
								api.txt
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								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. |    '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 |    'damage'        how many health points the mob does to a player or another | ||||||
|                    mob when melee attacking. |                    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 |    'knock_back'    when true has mobs falling backwards when hit, the greater | ||||||
|                    the damage the more they move back. |                    the damage the more they move back. | ||||||
|    'fear_height'   is how high a cliff or edge has to be before the mob stops |    'fear_height'   is how high a cliff or edge has to be before the mob stops | ||||||
| @@ -64,8 +66,12 @@ functions needed for the mob to work properly which contains the following: | |||||||
|    'fall_damage'   when true causes falling to inflict damage. |    'fall_damage'   when true causes falling to inflict damage. | ||||||
|    'water_damage'  holds the damage per second infliced to mobs when standing in |    'water_damage'  holds the damage per second infliced to mobs when standing in | ||||||
|                    water. |                    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 |    '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 |    'light_damage'  holds the damage per second inflicted to mobs when light | ||||||
|                    level is between the min and max values below |                    level is between the min and max values below | ||||||
|    'light_damage_min' minimum light value when mob is affected (default: 14) |    'light_damage_min' minimum light value when mob is affected (default: 14) | ||||||
| @@ -75,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. |    '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 |    '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 |                    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 |    'reach'               is how far the mob can attack player when standing | ||||||
|                          nearby, default is 3 nodes. |                          nearby, default is 3 nodes. | ||||||
| @@ -117,6 +123,8 @@ functions needed for the mob to work properly which contains the following: | |||||||
|                          continue chasing. |                          continue chasing. | ||||||
|    'arrow'               holds the pre-defined arrow object to shoot when |    'arrow'               holds the pre-defined arrow object to shoot when | ||||||
|                          attacking. |                          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 |    'dogshoot_switch'     allows switching between attack types by using timers | ||||||
|                          (1 for shoot, 2 for dogfight) |                          (1 for shoot, 2 for dogfight) | ||||||
|    'dogshoot_count_max'  contains how many seconds before switching from |    'dogshoot_count_max'  contains how many seconds before switching from | ||||||
| @@ -130,6 +138,8 @@ functions needed for the mob to work properly which contains the following: | |||||||
|                          e.g. {"player", "mobs_animal:chicken"}. |                          e.g. {"player", "mobs_animal:chicken"}. | ||||||
|    'runaway_from'        contains a table with mob names to run away from, add |    'runaway_from'        contains a table with mob names to run away from, add | ||||||
|                          "player" to list to runaway from player also. |                          "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 |    'blood_amount'        contains the number of blood droplets to appear when | ||||||
|                          mob is hit. |                          mob is hit. | ||||||
|    'blood_texture'       has the texture name to use for droplets e.g. |    'blood_texture'       has the texture name to use for droplets e.g. | ||||||
| @@ -199,7 +209,8 @@ functions needed for the mob to work properly which contains the following: | |||||||
|    'double_melee_attack' when true has the api choose between 'punch' and |    'double_melee_attack' when true has the api choose between 'punch' and | ||||||
|                       'punch2' animations. [DEPRECATED] |                       'punch2' animations. [DEPRECATED] | ||||||
|  |  | ||||||
|    'animation'       holds a table containing animation names and settings for use with mesh models: |    'animation'       holds a table containing animation names and settings for use with | ||||||
|  |                      mesh models: | ||||||
|       'stand_start'  start frame for when mob stands still. |       'stand_start'  start frame for when mob stands still. | ||||||
|       'stand_end'    end frame of stand animation. |       'stand_end'    end frame of stand animation. | ||||||
|       'stand_speed'  speed of animation in frames per second. |       'stand_speed'  speed of animation in frames per second. | ||||||
| @@ -225,6 +236,7 @@ functions needed for the mob to work properly which contains the following: | |||||||
|       'die_end' |       'die_end' | ||||||
|       'die_speed' |       'die_speed' | ||||||
|       'die_loop'     when set to false stops the animation looping. |       'die_loop'     when set to false stops the animation looping. | ||||||
|  |       'die_rotate'   if true mob spins during death animation. | ||||||
|  |  | ||||||
|       Using '_loop = false' setting will stop any of the above animations from |       Using '_loop = false' setting will stop any of the above animations from | ||||||
|       looping. |       looping. | ||||||
| @@ -297,6 +309,9 @@ enhance mob functionality and have them do many interesting things: | |||||||
|                     is returned normal attack function continued. |                     is returned normal attack function continued. | ||||||
|    'on_die'         a function that is called when mob is killed (self, pos), also |    'on_die'         a function that is called when mob is killed (self, pos), also | ||||||
|                     has access to self.cause_of_death table. |                     has access to self.cause_of_death table. | ||||||
|  |    'on_flop'        function called when flying or swimmimng mob is no longer in | ||||||
|  |                     air/water, (self) paramater and return true to skip the built | ||||||
|  |                     in api flop feature. | ||||||
|    'do_custom'      a custom function that is called every tick while mob is |    'do_custom'      a custom function that is called every tick while mob is | ||||||
|                     active and which has access to all of the self.* variables |                     active and which has access to all of the self.* variables | ||||||
|                     e.g. (self.health for health or self.standing_in for node |                     e.g. (self.health for health or self.standing_in for node | ||||||
| @@ -328,6 +343,14 @@ for each mob. | |||||||
|    'self.order'         set to "follow" or "stand" so that npc will follow owner |    'self.order'         set to "follow" or "stand" so that npc will follow owner | ||||||
|                         or stand it's ground |                         or stand it's ground | ||||||
|    'self.nametag'       contains the name of the mob which it can show above |    'self.nametag'       contains the name of the mob which it can show above | ||||||
|  |    'self.state'         Current mob state. | ||||||
|  |                         "stand": no movement (except turning around) | ||||||
|  |                         "walk": walk or move around aimlessly | ||||||
|  |                         "attack": chase and attack enemy | ||||||
|  |                         "runaway": flee from target | ||||||
|  |                         "flop": bounce around aimlessly | ||||||
|  |                                 (for swimming mobs that have stranded) | ||||||
|  |                         "die": during death | ||||||
|  |  | ||||||
|  |  | ||||||
| Adding Mobs in World | Adding Mobs in World | ||||||
| @@ -344,6 +367,15 @@ Adding Mobs in World | |||||||
| Returns false if mob could not be added, returns mob object if spawned ok. | Returns false if mob could not be added, returns mob object if spawned ok. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Removing Mob from World | ||||||
|  | ----------------------- | ||||||
|  |  | ||||||
|  | 	mobs:remove(self, decrease) | ||||||
|  |  | ||||||
|  | Removes mob 'self' from the world and if 'decrease' is true then the mob counter | ||||||
|  | will also be decreased by one. | ||||||
|  |  | ||||||
|  |  | ||||||
| Spawning Mobs in World | Spawning Mobs in World | ||||||
| ---------------------- | ---------------------- | ||||||
|  |  | ||||||
| @@ -373,6 +405,9 @@ default setting and can be omitted: | |||||||
|                           anytime |                           anytime | ||||||
|     'on_spawn'            is a custom function which runs after mob has spawned |     'on_spawn'            is a custom function which runs after mob has spawned | ||||||
|                           and gives self and pos values. |                           and gives self and pos values. | ||||||
|  |     'on_map_load'         when true mobs will have a chance of spawning only | ||||||
|  |                           when new areas of map are loaded, interval will not be | ||||||
|  |                           used. | ||||||
|  |  | ||||||
| The older spawn functions are still active and working but have no defaults like | The older spawn functions are still active and working but have no defaults like | ||||||
| the mobs:spawn, so it is recommended to use the above instead. | the mobs:spawn, so it is recommended to use the above instead. | ||||||
| @@ -380,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, | mobs:register_spawn(name, nodes, max_light, min_light, chance, | ||||||
|    active_object_count, max_height, day_toggle) |    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) |    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) | A simpler way to handle mob spawns has been added with the mobs:spawn(def) | ||||||
| @@ -434,6 +469,8 @@ This function registers a arrow for mobs with the attack type shoot. | |||||||
|        'visual'       same is in minetest.register_entity() |        'visual'       same is in minetest.register_entity() | ||||||
|        'visual_size'  same is in minetest.register_entity() |        'visual_size'  same is in minetest.register_entity() | ||||||
|        'textures'     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 |        'velocity'     the velocity of the arrow | ||||||
|        'drop'         if set to true any arrows hitting a node will drop as item |        '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; |        'hit_player'   a function that is called when the arrow hits a player; | ||||||
| @@ -647,6 +684,19 @@ Use this instead: | |||||||
|     mob_class:line_of_sight(pos1, pos2, stepsize) |     mob_class:line_of_sight(pos1, pos2, stepsize) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | mobs:can_spawn(pos, name) | ||||||
|  |  | ||||||
|  | This function checks the surrounding area at [pos] to see if there is enough empty | ||||||
|  | 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" | External Settings for "minetest.conf" | ||||||
| ------------------------------------ | ------------------------------------ | ||||||
|  |  | ||||||
| @@ -657,6 +707,8 @@ External Settings for "minetest.conf" | |||||||
|                             is false) |                             is false) | ||||||
|    'mobs_spawn_protected'   if set to false then mobs will not spawn in protected |    'mobs_spawn_protected'   if set to false then mobs will not spawn in protected | ||||||
|                             areas (default is true) |                             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 |    'remove_far_mobs'        if true then untamed mobs that are outside players | ||||||
|                              visual range will be removed (default is true) |                              visual range will be removed (default is true) | ||||||
|    'mobname'                can change specific mob chance rate (0 to disable) and |    'mobname'                can change specific mob chance rate (0 to disable) and | ||||||
| @@ -677,6 +729,10 @@ External Settings for "minetest.conf" | |||||||
|                             function. |                             function. | ||||||
|    'mob_nospawn_range'      Minimum range a mob can spawn near player (def: 12) |    'mob_nospawn_range'      Minimum range a mob can spawn near player (def: 12) | ||||||
|    'mob_active_limit'       Number of active mobs in game, 0 for unlimited |    'mob_active_limit'       Number of active mobs in game, 0 for unlimited | ||||||
|  |    '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 | 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 | to their minetest.conf file with a new value, the lower the value the more each | ||||||
| @@ -688,8 +744,8 @@ mobs_monster:sand_monster 100 | |||||||
| ...you can also change how many of a certain mob appear in an active mapblock by | ...you can also change how many of a certain mob appear in an active mapblock by | ||||||
| adding a comma and then a new value e.g. | adding a comma and then a new value e.g. | ||||||
|  |  | ||||||
| mobs_animal:cow 8000,4            <-- 4 cows per mapblock at 8000 spawn chance | mobs_animal:cow = 8000,4            <-- 4 cows per mapblock at 8000 spawn chance | ||||||
| mobs_monster:dirt_monster ,20     <-- 20 dirt monsters per mapblock | mobs_monster:dirt_monster = ,20     <-- 20 dirt monsters per mapblock | ||||||
|  |  | ||||||
|  |  | ||||||
| Rideable Horse Example Mob | Rideable Horse Example Mob | ||||||
|   | |||||||
							
								
								
									
										62
									
								
								crafts.lua
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								crafts.lua
									
									
									
									
									
								
							| @@ -5,14 +5,13 @@ local S = mobs.intllib | |||||||
| minetest.register_craftitem("mobs:nametag", { | minetest.register_craftitem("mobs:nametag", { | ||||||
| 	description = S("Name Tag"), | 	description = S("Name Tag"), | ||||||
| 	inventory_image = "mobs_nametag.png", | 	inventory_image = "mobs_nametag.png", | ||||||
| 	groups = {flammable = 2} | 	groups = {flammable = 2, nametag = 1} | ||||||
| }) | }) | ||||||
|  |  | ||||||
| if minetest.get_modpath("dye") and minetest.get_modpath("farming") then | if minetest.get_modpath("dye") and minetest.get_modpath("farming") then | ||||||
| 	minetest.register_craft({ | 	minetest.register_craft({ | ||||||
| 		type = "shapeless", |  | ||||||
| 		output = "mobs:nametag", | 		output = "mobs:nametag", | ||||||
| 		recipe = {"default:paper", "dye:black", "farming:string"} | 		recipe = {{"default:paper", "dye:black", "farming:string"}} | ||||||
| 	}) | 	}) | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -20,7 +19,7 @@ end | |||||||
| minetest.register_craftitem("mobs:leather", { | minetest.register_craftitem("mobs:leather", { | ||||||
| 	description = S("Leather"), | 	description = S("Leather"), | ||||||
| 	inventory_image = "mobs_leather.png", | 	inventory_image = "mobs_leather.png", | ||||||
| 	groups = {flammable = 2} | 	groups = {flammable = 2, leather = 1} | ||||||
| }) | }) | ||||||
|  |  | ||||||
| -- raw meat | -- raw meat | ||||||
| @@ -115,11 +114,27 @@ 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 | -- saddle | ||||||
| minetest.register_craftitem("mobs:saddle", { | minetest.register_craftitem("mobs:saddle", { | ||||||
| 	description = S("Saddle"), | 	description = S("Saddle"), | ||||||
| 	inventory_image = "mobs_saddle.png", | 	inventory_image = "mobs_saddle.png", | ||||||
| 	groups = {flammable = 2} | 	groups = {flammable = 2, saddle = 1} | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_craft({ | minetest.register_craft({ | ||||||
| @@ -133,7 +148,7 @@ minetest.register_craft({ | |||||||
|  |  | ||||||
|  |  | ||||||
| -- make sure we can register fences | -- 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) | -- mob fence (looks like normal fence but collision is 2 high) | ||||||
| default.register_fence("mobs:fence_wood", { | 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) | -- mob fence top (has enlarged collisionbox to stop mobs getting over) | ||||||
| minetest.register_node("mobs:fence_top", { | minetest.register_node("mobs:fence_top", { | ||||||
| @@ -181,8 +197,6 @@ minetest.register_craft({ | |||||||
| 	} | 	} | ||||||
| }) | }) | ||||||
|  |  | ||||||
| end |  | ||||||
|  |  | ||||||
|  |  | ||||||
| -- items that can be used as fuel | -- items that can be used as fuel | ||||||
| minetest.register_craft({ | minetest.register_craft({ | ||||||
| @@ -283,12 +297,18 @@ minetest.register_tool(":mobs:mob_reset_stick", { | |||||||
|  |  | ||||||
| 			tex_obj = obj | 			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 name = user:get_player_name() | ||||||
| 			local tex = "" |  | ||||||
|  |  | ||||||
| 			minetest.show_formspec(name, "mobs_texture", "size[8,4]" | 			minetest.show_formspec(name, "mobs_texture", "size[8,4]" | ||||||
| 			.. "field[0.5,1;7.5,0;name;" | 			.. "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;" | 			.. "button_exit[2.5,3.5;3,1;mob_texture_change;" | ||||||
| 			.. minetest.formspec_escape(S("Change")) .. "]") | 			.. minetest.formspec_escape(S("Change")) .. "]") | ||||||
| 		end | 		end | ||||||
| @@ -331,3 +351,25 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) | |||||||
| 		tex_obj = nil | 		tex_obj = nil | ||||||
| 	end | 	end | ||||||
| end) | end) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | -- Meat Block (thanks to painterlypack.net for allowing me to use these textures) | ||||||
|  | minetest.register_node("mobs:meatblock", { | ||||||
|  | 	description = S("Meat Block"), | ||||||
|  | 	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 and default.node_sound_leaves_defaults(), | ||||||
|  | 	on_place = minetest.rotate_node, | ||||||
|  | 	on_use = minetest.item_eat(20) | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | minetest.register_craft({ | ||||||
|  | 	output = "mobs:meatblock", | ||||||
|  | --	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"} | ||||||
|  | 	} | ||||||
|  | }) | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| default | default? | ||||||
| tnt? | tnt? | ||||||
| dye? | dye? | ||||||
| farming? | farming? | ||||||
| @@ -7,3 +7,5 @@ intllib? | |||||||
| lucky_block? | lucky_block? | ||||||
| cmi? | cmi? | ||||||
| toolranks? | toolranks? | ||||||
|  | pathfinder? | ||||||
|  | player_api? | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								init.lua
									
									
									
									
									
								
							| @@ -1,6 +1,12 @@ | |||||||
|  |  | ||||||
| local path = minetest.get_modpath("mobs") | local path = minetest.get_modpath("mobs") | ||||||
|  |  | ||||||
|  | -- Peaceful player privilege | ||||||
|  | minetest.register_privilege("peaceful_player", { | ||||||
|  | 	description = "Prevents Mobs Redo mobs from attacking player", | ||||||
|  | 	give_to_singleplayer = false | ||||||
|  | }) | ||||||
|  |  | ||||||
| -- Mob API | -- Mob API | ||||||
| dofile(path .. "/api.lua") | dofile(path .. "/api.lua") | ||||||
|  |  | ||||||
| @@ -16,4 +22,4 @@ dofile(path .. "/spawner.lua") | |||||||
| -- Lucky Blocks | -- Lucky Blocks | ||||||
| dofile(path .. "/lucky_block.lua") | dofile(path .. "/lucky_block.lua") | ||||||
|  |  | ||||||
| minetest.log("action", "[MOD] Mobs Redo loaded") | print("[MOD] Mobs Redo loaded") | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								intllib.lua
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								intllib.lua
									
									
									
									
									
								
							| @@ -1,45 +0,0 @@ | |||||||
|  |  | ||||||
| -- Fallback functions for when `intllib` is not installed. |  | ||||||
| -- Code released under Unlicense <http://unlicense.org>. |  | ||||||
|  |  | ||||||
| -- Get the latest version of this file at: |  | ||||||
| --   https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua |  | ||||||
|  |  | ||||||
| local function format(str, ...) |  | ||||||
| 	local args = { ... } |  | ||||||
| 	local function repl(escape, open, num, close) |  | ||||||
| 		if escape == "" then |  | ||||||
| 			local replacement = tostring(args[tonumber(num)]) |  | ||||||
| 			if open == "" then |  | ||||||
| 				replacement = replacement..close |  | ||||||
| 			end |  | ||||||
| 			return replacement |  | ||||||
| 		else |  | ||||||
| 			return "@"..open..num..close |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| 	return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| local gettext, ngettext |  | ||||||
| if minetest.get_modpath("intllib") then |  | ||||||
| 	if intllib.make_gettext_pair then |  | ||||||
| 		-- New method using gettext. |  | ||||||
| 		gettext, ngettext = intllib.make_gettext_pair() |  | ||||||
| 	else |  | ||||||
| 		-- Old method using text files. |  | ||||||
| 		gettext = intllib.Getter() |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Fill in missing functions. |  | ||||||
|  |  | ||||||
| gettext = gettext or function(msgid, ...) |  | ||||||
| 	return format(msgid, ...) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| ngettext = ngettext or function(msgid, msgid_plural, n, ...) |  | ||||||
| 	return format(n==1 and msgid or msgid_plural, ...) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| return gettext, ngettext |  | ||||||
| @@ -11,7 +11,7 @@ msgstr "" | |||||||
| "PO-Revision-Date: 2017-07-02 14:27+0200\n" | "PO-Revision-Date: 2017-07-02 14:27+0200\n" | ||||||
| "Last-Translator: Wuzzy <almikes@aol.com>\n" | "Last-Translator: Wuzzy <almikes@aol.com>\n" | ||||||
| "Language-Team: \n" | "Language-Team: \n" | ||||||
| "Language: de_DE\n" | "Language: de\n" | ||||||
| "MIME-Version: 1.0\n" | "MIME-Version: 1.0\n" | ||||||
| "Content-Type: text/plain; charset=UTF-8\n" | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								locale/fr.po
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								locale/fr.po
									
									
									
									
									
								
							| @@ -3,20 +3,19 @@ | |||||||
| # This file is distributed under the same license as the PACKAGE package. | # This file is distributed under the same license as the PACKAGE package. | ||||||
| # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. | # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. | ||||||
| # | # | ||||||
|  | #, fuzzy | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: \n" | "Project-Id-Version: \n" | ||||||
| "Report-Msgid-Bugs-To: \n" | "Report-Msgid-Bugs-To: \n" | ||||||
| "POT-Creation-Date: 2017-07-29 09:13+0200\n" | "POT-Creation-Date: 2017-07-29 09:13+0200\n" | ||||||
| "PO-Revision-Date: 2017-07-29 09:20+0200\n" | "PO-Revision-Date: 2020-08-13 21:20+0500\n" | ||||||
|  | "Last-Translator: Olivier Dragon <odragon@protonmail.com>\n" | ||||||
| "Language-Team: \n" | "Language-Team: \n" | ||||||
|  | "Language: fr\n" | ||||||
| "MIME-Version: 1.0\n" | "MIME-Version: 1.0\n" | ||||||
| "Content-Type: text/plain; charset=UTF-8\n" | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "X-Generator: Poedit 1.8.12\n" |  | ||||||
| "Last-Translator: fat115 <fat115@framasoft.org>\n" |  | ||||||
| "Plural-Forms: nplurals=2; plural=(n > 1);\n" |  | ||||||
| "Language: fr\n" |  | ||||||
|  |  | ||||||
| #: api.lua | #: api.lua | ||||||
| msgid "** Peaceful Mode Active - No Monsters Will Spawn" | msgid "** Peaceful Mode Active - No Monsters Will Spawn" | ||||||
| @@ -64,7 +63,7 @@ msgstr "Renommer" | |||||||
|  |  | ||||||
| #: crafts.lua | #: crafts.lua | ||||||
| msgid "Name Tag" | msgid "Name Tag" | ||||||
| msgstr "Étiquette pour collier" | msgstr "Étiquette de collier" | ||||||
|  |  | ||||||
| #: crafts.lua | #: crafts.lua | ||||||
| msgid "Leather" | msgid "Leather" | ||||||
| @@ -102,18 +101,26 @@ msgstr "Selle" | |||||||
| msgid "Mob Fence" | msgid "Mob Fence" | ||||||
| msgstr "Clôture à animaux" | msgstr "Clôture à animaux" | ||||||
|  |  | ||||||
|  | #: crafts.lua | ||||||
|  | msgid "Mob Fence Top" | ||||||
|  | msgstr "Haut de clôture à animaux" | ||||||
|  |  | ||||||
| #: spawner.lua | #: spawner.lua | ||||||
| msgid "Mob Spawner" | msgid "Mob Spawner" | ||||||
| msgstr "Générateur de mob" | msgstr "Générateur de mob" | ||||||
|  |  | ||||||
| #: spawner.lua | #: spawner.lua | ||||||
| msgid "Mob MinLight MaxLight Amount PlayerDist" | msgid "(mob name) (min light) (max light) (amount) (player distance) (Y offset)" | ||||||
| msgstr "Mob MinLumière MaxLumière Quantité DistanceJoueur" | msgstr "(Nom) (MinLumière) (MaxLumière) (Quantité) (Distance du Joueur) (Décalage en Y)" | ||||||
|  |  | ||||||
| #: spawner.lua | #: spawner.lua | ||||||
| msgid "Spawner Not Active (enter settings)" | msgid "Spawner Not Active (enter settings)" | ||||||
| msgstr "Générateur non actif (entrez les paramètres)" | msgstr "Générateur non actif (entrez les paramètres)" | ||||||
|  |  | ||||||
|  | #: spawner.lua | ||||||
|  | msgid "Command:" | ||||||
|  | msgstr "Commande:" | ||||||
|  |  | ||||||
| #: spawner.lua | #: spawner.lua | ||||||
| msgid "Spawner Active (@1)" | msgid "Spawner Active (@1)" | ||||||
| msgstr "Générateur actif (@1)" | msgstr "Générateur actif (@1)" | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								locale/mobs.de.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.de.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | #** Peaceful Mode Active - No Monsters Will Spawn= | ||||||
|  | @1 (Tamed)=@1 (Gezähmt) | ||||||
|  | @1 at full health (@2)=@1 bei voller Gesundheit (@2) | ||||||
|  | @1 has been tamed!=@1 wurde gezähmt! | ||||||
|  | @1 is owner!=@1 ist der Besitzer! | ||||||
|  | #Active Mob Limit Reached!= | ||||||
|  | Already protected!=Bereits geschützt! | ||||||
|  | #Change= | ||||||
|  | #Command:= | ||||||
|  | Enter name:=Namen eingeben: | ||||||
|  | #Enter texture:= | ||||||
|  | Lasso (right-click animal to put in inventory)=Lasso (Rechtsklick auf Tier, um es zu nehmen) | ||||||
|  | Leather=Leder | ||||||
|  | Meat=Fleisch | ||||||
|  | Missed!=Daneben! | ||||||
|  | Mob Fence=Kreaturen Zaun | ||||||
|  | #Mob Fence Top= | ||||||
|  | Mob Protection Rune=Kreaturschutzrune | ||||||
|  | #Mob Reset Stick= | ||||||
|  | #Mob Spawner= | ||||||
|  | Mob Spawner settings failed!=Kreaturenspawner-Einstellungen gescheitert! | ||||||
|  | Mob has been protected!=Kreatur wurde geschützt! | ||||||
|  | Name Tag=Namensschild | ||||||
|  | Net (right-click animal to put in inventory)=Netz (Rechtsklick auf Tier, um es zu nehmen) | ||||||
|  | Not tamed!=Nicht gezähmt! | ||||||
|  | Raw Meat=Rohes Fleisch | ||||||
|  | Rename=Umbenennen | ||||||
|  | Saddle=Sattel | ||||||
|  | Spawner Active (@1)=Spawner aktiv (@1) | ||||||
|  | Spawner Not Active (enter settings)=Nicht aktiv (Einstellungen eingeben) | ||||||
|  | Steel Shears (right-click to shear)=Stahlschere (Rechtsklick zum Scheren) | ||||||
|  | #Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= | ||||||
|  | #lifetimer expired, removed @1= | ||||||
							
								
								
									
										34
									
								
								locale/mobs.en.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.en.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | #** Peaceful Mode Active - No Monsters Will Spawn= | ||||||
|  | #@1 (Tamed)= | ||||||
|  | #@1 at full health (@2)= | ||||||
|  | #@1 has been tamed!= | ||||||
|  | #@1 is owner!= | ||||||
|  | #Active Mob Limit Reached!= | ||||||
|  | #Already protected!= | ||||||
|  | #Change= | ||||||
|  | #Command:= | ||||||
|  | #Enter name:= | ||||||
|  | #Enter texture:= | ||||||
|  | #Lasso (right-click animal to put in inventory)= | ||||||
|  | #Leather= | ||||||
|  | #Meat= | ||||||
|  | #Missed!= | ||||||
|  | #Mob Fence= | ||||||
|  | #Mob Fence Top= | ||||||
|  | #Mob Protection Rune= | ||||||
|  | #Mob Reset Stick= | ||||||
|  | #Mob Spawner= | ||||||
|  | #Mob Spawner settings failed!= | ||||||
|  | #Mob has been protected!= | ||||||
|  | #Name Tag= | ||||||
|  | #Net (right-click animal to put in inventory)= | ||||||
|  | #Not tamed!= | ||||||
|  | #Raw Meat= | ||||||
|  | #Rename= | ||||||
|  | #Saddle= | ||||||
|  | #Spawner Active (@1)= | ||||||
|  | #Spawner Not Active (enter settings)= | ||||||
|  | #Steel Shears (right-click to shear)= | ||||||
|  | #Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= | ||||||
|  | #lifetimer expired, removed @1= | ||||||
							
								
								
									
										34
									
								
								locale/mobs.es.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.es.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | #** Peaceful Mode Active - No Monsters Will Spawn= | ||||||
|  | @1 (Tamed)=@1 (Domesticado) | ||||||
|  | @1 at full health (@2)=@1 con salud llena (@2) | ||||||
|  | @1 has been tamed!=@1 ha sido domesticado! | ||||||
|  | @1 is owner!=@1 es el dueño! | ||||||
|  | #Active Mob Limit Reached!= | ||||||
|  | Already protected!=Ya está protegido! | ||||||
|  | #Change= | ||||||
|  | #Command:= | ||||||
|  | Enter name:=Ingrese nombre: | ||||||
|  | #Enter texture:= | ||||||
|  | Lasso (right-click animal to put in inventory)=Lazo (click derecho en animal para colocar en inventario) | ||||||
|  | Leather=Cuero | ||||||
|  | Meat=Carne | ||||||
|  | Missed!=Perdido! | ||||||
|  | #Mob Fence= | ||||||
|  | #Mob Fence Top= | ||||||
|  | Mob Protection Rune=Runa de protección de Mob | ||||||
|  | #Mob Reset Stick= | ||||||
|  | #Mob Spawner= | ||||||
|  | Mob Spawner settings failed!=Configuracion de generador de Mob falló! | ||||||
|  | Mob has been protected!=El mob ha sido protegido! | ||||||
|  | Name Tag=Nombrar etiqueta | ||||||
|  | Net (right-click animal to put in inventory)=Red (click derecho en animal para colocar en inventario) | ||||||
|  | Not tamed!=No domesticado! | ||||||
|  | Raw Meat=Carne cruda | ||||||
|  | Rename=Renombrar | ||||||
|  | Saddle=Montura | ||||||
|  | Spawner Active (@1)=Generador activo (@1) | ||||||
|  | Spawner Not Active (enter settings)=Generador no activo (ingrese config) | ||||||
|  | Steel Shears (right-click to shear)=Tijera de acero (click derecho para esquilar) | ||||||
|  | #Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= | ||||||
|  | #lifetimer expired, removed @1= | ||||||
							
								
								
									
										34
									
								
								locale/mobs.fr.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.fr.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | ** Peaceful Mode Active - No Monsters Will Spawn=** Mode pacifique activé - aucun monstre ne sera généré | ||||||
|  | @1 (Tamed)=@1 (apprivoisé) | ||||||
|  | @1 at full health (@2)=@1 est en pleine forme (@2)  | ||||||
|  | @1 has been tamed!=@1 a été apprivoisé !  | ||||||
|  | @1 is owner!=Appartient à @1 ! | ||||||
|  | Active Mob Limit Reached!=Limite atteinte du nombre des êtres vivants actifs ! | ||||||
|  | Already protected!=Déjà protégé ! | ||||||
|  | Change=Changer | ||||||
|  | Command:=Commande : | ||||||
|  | Enter name:=Saisissez un nom : | ||||||
|  | Enter texture:=Saisissez une texture : | ||||||
|  | Lasso (right-click animal to put in inventory)=Lasso (clic droit sur l'animal pour le mettre dans l'inventaire) | ||||||
|  | Leather=Cuir | ||||||
|  | Meat=Viande | ||||||
|  | Missed!=Raté ! | ||||||
|  | Mob Fence= Clôture à animaux | ||||||
|  | Mob Fence Top=Haut de clôture à animaux | ||||||
|  | Mob Protection Rune=Rune de protection des animaux | ||||||
|  | Mob Reset Stick=Baguette de réinitialisation des êtres vivants | ||||||
|  | Mob Spawner=Créateur d'êtres vivants | ||||||
|  | Mob Spawner settings failed!=Échec des paramètres du créateur d'être vivants ! | ||||||
|  | Mob has been protected!=L'animal a été protégé ! | ||||||
|  | Name Tag=Étiquette de collier | ||||||
|  | Net (right-click animal to put in inventory)=Filet (clic droit sur l'animal pour le mettre dans l'inventaire) | ||||||
|  | Not tamed!=Non-apprivoisé ! | ||||||
|  | Raw Meat=Viande crue | ||||||
|  | Rename=Renommer | ||||||
|  | Saddle=Selle | ||||||
|  | Spawner Active (@1)=Créateur actif (@1) | ||||||
|  | Spawner Not Active (enter settings)=Créateur non actif (entrez les paramètres) | ||||||
|  | Steel Shears (right-click to shear)=Ciseaux à laine (clic droit pour tondre) | ||||||
|  | Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”=Syntaxe : «name min_lumière[0-14] max_lumière[0-14] max_être_vivant_dans_région[0 pour désactiver] distance_joueur[1-20] décalage_y[-10 to 10]» | ||||||
|  | lifetimer expired, removed @1=Être immortel expiré ; @1 retiré | ||||||
							
								
								
									
										34
									
								
								locale/mobs.it.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.it.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | ** Peaceful Mode Active - No Monsters Will Spawn=** Modalità pacifica attiva - non comparirà nessun mostro | ||||||
|  | @1 (Tamed)=@1 (Addomesticato) | ||||||
|  | @1 at full health (@2)=@1 in piena salute (@2) | ||||||
|  | @1 has been tamed!=@1 è stato addomesticato! | ||||||
|  | @1 is owner!=Il padrone è @1! | ||||||
|  | #Active Mob Limit Reached!= | ||||||
|  | Already protected!=Già protetto! | ||||||
|  | #Change= | ||||||
|  | #Command:= | ||||||
|  | Enter name:=Inserire il nome: | ||||||
|  | #Enter texture:= | ||||||
|  | Lasso (right-click animal to put in inventory)=Lazo (click di destro per mettere l'animale nell'inventario) | ||||||
|  | Leather=Pelle | ||||||
|  | Meat=Carne | ||||||
|  | Missed!=Mancato! | ||||||
|  | Mob Fence=Recinzione per mob | ||||||
|  | #Mob Fence Top= | ||||||
|  | Mob Protection Rune=Runa di protezione per mob | ||||||
|  | #Mob Reset Stick= | ||||||
|  | #Mob Spawner= | ||||||
|  | Mob Spawner settings failed!=Impostazioni del generatore di mob fallite! | ||||||
|  | Mob has been protected!=Il mob è stato protetto! | ||||||
|  | Name Tag=Targhetta | ||||||
|  | Net (right-click animal to put in inventory)=Rete (click destro per mettere l'animale nell'inventario) | ||||||
|  | Not tamed!=Non addomesticato! | ||||||
|  | Raw Meat=Carne cruda | ||||||
|  | Rename=Rinomina | ||||||
|  | Saddle=Sella | ||||||
|  | Spawner Active (@1)=Generatore attivo (@1) | ||||||
|  | Spawner Not Active (enter settings)=Generatore inattivo (inserire le impostazioni) | ||||||
|  | Steel Shears (right-click to shear)=Cesoie d'acciaio (click destro per tosare) | ||||||
|  | #Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= | ||||||
|  | #lifetimer expired, removed @1= | ||||||
							
								
								
									
										34
									
								
								locale/mobs.ms.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.ms.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | ** Peaceful Mode Active - No Monsters Will Spawn=** Mod Aman Diaktifkan - Tiada Raksasa Akan Muncul | ||||||
|  | @1 (Tamed)=@1 (Jinak) | ||||||
|  | @1 at full health (@2)=Mata kesihatan @1 telah penuh (@2) | ||||||
|  | @1 has been tamed!=@1 telah dijinakkan! | ||||||
|  | @1 is owner!=Ini hak milik @1! | ||||||
|  | #Active Mob Limit Reached!= | ||||||
|  | Already protected!=Telah dilindungi! | ||||||
|  | #Change= | ||||||
|  | #Command:= | ||||||
|  | Enter name:=Masukkan nama: | ||||||
|  | #Enter texture:= | ||||||
|  | Lasso (right-click animal to put in inventory)=Tanjul (klik-kanan haiwan untuk masukkan ke inventori) | ||||||
|  | Leather=Kulit | ||||||
|  | Meat=Daging Bakar | ||||||
|  | Missed!=Terlepas! | ||||||
|  | Mob Fence=Pagar Mob | ||||||
|  | #Mob Fence Top= | ||||||
|  | Mob Protection Rune=Rune Perlindungan Mob | ||||||
|  | #Mob Reset Stick= | ||||||
|  | #Mob Spawner= | ||||||
|  | Mob Spawner settings failed!=Penetapan Pewujud Mob gagal! | ||||||
|  | Mob has been protected!=Mob telah pun dilindungi! | ||||||
|  | Name Tag=Tanda Nama | ||||||
|  | Net (right-click animal to put in inventory)=Jaring (klik-kanan haiwan untuk masukkan ke inventori) | ||||||
|  | Not tamed!=Belum dijinakkan! | ||||||
|  | Raw Meat=Daging Mentah | ||||||
|  | Rename=Namakan semula | ||||||
|  | Saddle=Pelana | ||||||
|  | Spawner Active (@1)=Pewujud Mob Aktif (@1) | ||||||
|  | Spawner Not Active (enter settings)=Pewujud Mob Tidak Aktif (masukkan tetapan) | ||||||
|  | Steel Shears (right-click to shear)=Ketam Keluli (klik-kanan untuk mengetam bulu biri-biri) | ||||||
|  | #Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= | ||||||
|  | #lifetimer expired, removed @1= | ||||||
							
								
								
									
										34
									
								
								locale/mobs.pt.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.pt.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | #** Peaceful Mode Active - No Monsters Will Spawn= | ||||||
|  | #@1 (Tamed)= | ||||||
|  | @1 at full health (@2)=@1 em plena saude (@2) | ||||||
|  | @1 has been tamed!=@1 foi domesticado! | ||||||
|  | @1 is owner!=Dono @1! | ||||||
|  | #Active Mob Limit Reached!= | ||||||
|  | #Already protected!= | ||||||
|  | #Change= | ||||||
|  | #Command:= | ||||||
|  | Enter name:=Insira um nome: | ||||||
|  | #Enter texture:= | ||||||
|  | Lasso (right-click animal to put in inventory)=Laço (clique-direito no animal para por no inventario) | ||||||
|  | Leather=Couro | ||||||
|  | Meat=Carne | ||||||
|  | Missed!=Faltou! | ||||||
|  | #Mob Fence= | ||||||
|  | #Mob Fence Top= | ||||||
|  | #Mob Protection Rune= | ||||||
|  | #Mob Reset Stick= | ||||||
|  | #Mob Spawner= | ||||||
|  | Mob Spawner settings failed!=Configuraçao de Spawnador do Mob falhou! | ||||||
|  | #Mob has been protected!= | ||||||
|  | Name Tag=Etiqueta | ||||||
|  | Net (right-click animal to put in inventory)=Net (clique-direito no animal para por no inventario) | ||||||
|  | Not tamed!=Indomesticado! | ||||||
|  | Raw Meat=Carne crua | ||||||
|  | Rename=Renomear | ||||||
|  | #Saddle= | ||||||
|  | Spawner Active (@1)=Spawnador Ativo (@1) | ||||||
|  | Spawner Not Active (enter settings)=Spawnador Inativo (configurar) | ||||||
|  | Steel Shears (right-click to shear)=Tesoura de Aço (clique-direito para tosquiar) | ||||||
|  | #Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= | ||||||
|  | #lifetimer expired, removed @1= | ||||||
							
								
								
									
										34
									
								
								locale/mobs.ru.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.ru.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | ** Peaceful Mode Active - No Monsters Will Spawn=** Мирный модус активирован - монстры не спаунятся | ||||||
|  | @1 (Tamed)=@1 (Прирученный) | ||||||
|  | @1 at full health (@2)=@1 при полном здоровье (@2) | ||||||
|  | @1 has been tamed!=@1 приручен | ||||||
|  | @1 is owner!=@1 владелец | ||||||
|  | #Active Mob Limit Reached!= | ||||||
|  | Already protected!=Уже защищен! | ||||||
|  | #Change= | ||||||
|  | #Command:= | ||||||
|  | Enter name:=Введите имя: | ||||||
|  | #Enter texture:= | ||||||
|  | Lasso (right-click animal to put in inventory)=Лассо (Правый клик - положить животное в инвентарь) | ||||||
|  | Leather=Кожа | ||||||
|  | Meat=Мясо | ||||||
|  | Missed!=Промазал! | ||||||
|  | Mob Fence=Забор от мобов | ||||||
|  | #Mob Fence Top= | ||||||
|  | Mob Protection Rune=Защитная руна мобов | ||||||
|  | #Mob Reset Stick= | ||||||
|  | #Mob Spawner= | ||||||
|  | Mob Spawner settings failed!=Настройки спаунера моба провалились | ||||||
|  | Mob has been protected!=Моб защищен! | ||||||
|  | Name Tag=Новый тэг | ||||||
|  | Net (right-click animal to put in inventory)=Сеть (Правый клик - положить животное в инвентарь) | ||||||
|  | Not tamed!=Не прирученный | ||||||
|  | Raw Meat=Сырое мясо | ||||||
|  | Rename=Переименовать | ||||||
|  | Saddle=Седло | ||||||
|  | Spawner Active (@1)=Активные спаунер (@1) | ||||||
|  | Spawner Not Active (enter settings)=Спаунер не активен (введите настройки) | ||||||
|  | Steel Shears (right-click to shear)=Ножницы (Правый клик - подстричь) | ||||||
|  | #Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= | ||||||
|  | #lifetimer expired, removed @1= | ||||||
							
								
								
									
										34
									
								
								locale/mobs.tr.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.tr.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | #** Peaceful Mode Active - No Monsters Will Spawn= | ||||||
|  | #@1 (Tamed)= | ||||||
|  | @1 at full health (@2)=@1 tam canında (@2) | ||||||
|  | @1 has been tamed!=@1 tamamen evcilleştirilmiştir! | ||||||
|  | @1 is owner!=Sahibi @1! | ||||||
|  | #Active Mob Limit Reached!= | ||||||
|  | #Already protected!= | ||||||
|  | #Change= | ||||||
|  | #Command:= | ||||||
|  | Enter name:=İsim gir: | ||||||
|  | #Enter texture:= | ||||||
|  | Lasso (right-click animal to put in inventory)=Kement (hayvana sağ tıklayarak envantere koy) | ||||||
|  | Leather=Deri | ||||||
|  | Meat=Et | ||||||
|  | Missed!=Kaçırdın! | ||||||
|  | Mob Fence=Canavar Yaratıcı | ||||||
|  | #Mob Fence Top= | ||||||
|  | #Mob Protection Rune= | ||||||
|  | #Mob Reset Stick= | ||||||
|  | #Mob Spawner= | ||||||
|  | Mob Spawner settings failed!=Yaratıcı ayarları uygulanamadı. | ||||||
|  | #Mob has been protected!= | ||||||
|  | Name Tag=İsim etiketi | ||||||
|  | Net (right-click animal to put in inventory)=Ağ (hayvana sağ tıklayarak envantere koy) | ||||||
|  | Not tamed!=Evcil değil! | ||||||
|  | Raw Meat=Çiğ et | ||||||
|  | Rename=Yeniden adlandır | ||||||
|  | #Saddle= | ||||||
|  | Spawner Active (@1)=Yaratıcı aktif (@1) | ||||||
|  | Spawner Not Active (enter settings)=Yaratıcı aktif değil (ayarlara gir) | ||||||
|  | Steel Shears (right-click to shear)=Çelik makas (sağ tıklayarak kes) | ||||||
|  | #Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= | ||||||
|  | #lifetimer expired, removed @1= | ||||||
							
								
								
									
										34
									
								
								locale/mobs.zh_CN.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.zh_CN.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | ** Peaceful Mode Active - No Monsters Will Spawn=** 和平模式已激活——没有怪物会产生 | ||||||
|  | @1 (Tamed)=@1(已驯服) | ||||||
|  | @1 at full health (@2)=@1已经满血(@2) | ||||||
|  | @1 has been tamed!=@1已经被驯服! | ||||||
|  | @1 is owner!=@1 是主人 | ||||||
|  | #Active Mob Limit Reached!= | ||||||
|  | Already protected!=已经被保护! | ||||||
|  | #Change= | ||||||
|  | #Command:= | ||||||
|  | Enter name:=输入名称: | ||||||
|  | #Enter texture:= | ||||||
|  | Lasso (right-click animal to put in inventory)=套索(右键单击动物以放入物品栏) | ||||||
|  | Leather=皮革 | ||||||
|  | Meat=肉 | ||||||
|  | Missed!=没抓住! | ||||||
|  | Mob Fence=Mob 栅栏 | ||||||
|  | #Mob Fence Top= | ||||||
|  | Mob Protection Rune=Mob 保护符文 | ||||||
|  | #Mob Reset Stick= | ||||||
|  | #Mob Spawner= | ||||||
|  | Mob Spawner settings failed!=Mob 孵化器设置失败! | ||||||
|  | Mob has been protected!=Mob 已经被保护了! | ||||||
|  | Name Tag=名称标签 | ||||||
|  | Net (right-click animal to put in inventory)=网(右键单击动物以放入物品栏) | ||||||
|  | Not tamed!=没有驯服! | ||||||
|  | Raw Meat=生肉 | ||||||
|  | Rename=重新命名 | ||||||
|  | Saddle=鞍 | ||||||
|  | Spawner Active (@1)=孵化器正在运转(@1) | ||||||
|  | Spawner Not Active (enter settings)=孵化器未使用(输入设置) | ||||||
|  | Steel Shears (right-click to shear)=钢剪(右键单击以剪切) | ||||||
|  | #Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= | ||||||
|  | #lifetimer expired, removed @1= | ||||||
							
								
								
									
										34
									
								
								locale/mobs.zh_TW.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.zh_TW.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | # textdomain:mobs | ||||||
|  | ** Peaceful Mode Active - No Monsters Will Spawn=** 和平模式已激活——沒有怪物會產生 | ||||||
|  | @1 (Tamed)=@1(已馴服) | ||||||
|  | @1 at full health (@2)=@1已經滿血(@2) | ||||||
|  | @1 has been tamed!=@1已經被馴服! | ||||||
|  | @1 is owner!=@1 是主人 | ||||||
|  | #Active Mob Limit Reached!= | ||||||
|  | Already protected!=已經被保護! | ||||||
|  | #Change= | ||||||
|  | #Command:= | ||||||
|  | Enter name:=輸入名稱: | ||||||
|  | #Enter texture:= | ||||||
|  | Lasso (right-click animal to put in inventory)=套索(右鍵單擊動物以放入物品欄) | ||||||
|  | Leather=皮革 | ||||||
|  | Meat=肉 | ||||||
|  | Missed!=沒抓住! | ||||||
|  | Mob Fence=Mob 柵欄 | ||||||
|  | #Mob Fence Top= | ||||||
|  | Mob Protection Rune=Mob 保護符文 | ||||||
|  | #Mob Reset Stick= | ||||||
|  | #Mob Spawner= | ||||||
|  | Mob Spawner settings failed!=Mob 孵化器設置失敗! | ||||||
|  | Mob has been protected!=Mob 已經被保護了! | ||||||
|  | Name Tag=名稱標籤 | ||||||
|  | Net (right-click animal to put in inventory)=網(右鍵單擊動物以放入物品欄) | ||||||
|  | Not tamed!=沒有馴服! | ||||||
|  | Raw Meat=生肉 | ||||||
|  | Rename=重新命名 | ||||||
|  | Saddle=鞍 | ||||||
|  | Spawner Active (@1)=孵化器正在運轉(@1) | ||||||
|  | Spawner Not Active (enter settings)=孵化器未使用(輸入設置) | ||||||
|  | Steel Shears (right-click to shear)=鋼剪(右鍵單擊以剪切) | ||||||
|  | #Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”= | ||||||
|  | #lifetimer expired, removed @1= | ||||||
| @@ -101,6 +101,10 @@ msgstr "" | |||||||
| msgid "Mob Fence" | msgid "Mob Fence" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|  | #: crafts.lua | ||||||
|  | msgid "Mob Fence Top" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
| #: spawner.lua | #: spawner.lua | ||||||
| msgid "Mob Spawner" | msgid "Mob Spawner" | ||||||
| msgstr "" | msgstr "" | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								mod.conf
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								mod.conf
									
									
									
									
									
								
							| @@ -1 +1,4 @@ | |||||||
| name = mobs | name = mobs | ||||||
|  | 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. | ||||||
|   | |||||||
							
								
								
									
										250
									
								
								mount.lua
									
									
									
									
									
								
							
							
						
						
									
										250
									
								
								mount.lua
									
									
									
									
									
								
							| @@ -1,10 +1,9 @@ | |||||||
|  |  | ||||||
| -- lib_mount by Blert2112 (edited by TenPlus1) | -- lib_mount by Blert2112 (edited by TenPlus1) | ||||||
|  |  | ||||||
| local enable_crash = false | local is_50 = minetest.get_modpath("player_api") -- 5.x compatibility | ||||||
| local crash_threshold = 6.5 -- ignored if enable_crash=false |  | ||||||
|  |  | ||||||
| ------------------------------------------------------------------------------ | local abs, cos, floor, sin, sqrt, pi = | ||||||
|  | 		math.abs, math.cos, math.floor, math.sin, math.sqrt, math.pi | ||||||
|  |  | ||||||
| -- | -- | ||||||
| -- Helper functions | -- Helper functions | ||||||
| @@ -55,27 +54,29 @@ local function get_sign(i) | |||||||
| 	if i == 0 then | 	if i == 0 then | ||||||
| 		return 0 | 		return 0 | ||||||
| 	else | 	else | ||||||
| 		return i / math.abs(i) | 		return i / abs(i) | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
| local function get_velocity(v, yaw, y) | local function get_velocity(v, yaw, y) | ||||||
|  |  | ||||||
| 	local x = -math.sin(yaw) * v | 	local x = -sin(yaw) * v | ||||||
| 	local z =  math.cos(yaw) * v | 	local z =  cos(yaw) * v | ||||||
|  |  | ||||||
| 	return {x = x, y = y, z = z} | 	return {x = x, y = y, z = z} | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
| local function get_v(v) | local function get_v(v) | ||||||
| 	return math.sqrt(v.x * v.x + v.z * v.z) | 	return sqrt(v.x * v.x + v.z * v.z) | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
| local function force_detach(player) | local function force_detach(player) | ||||||
|  |  | ||||||
|  | 	if not player then return end | ||||||
|  |  | ||||||
| 	local attached_to = player:get_attach() | 	local attached_to = player:get_attach() | ||||||
|  |  | ||||||
| 	if not attached_to then | 	if not attached_to then | ||||||
| @@ -86,43 +87,83 @@ local function force_detach(player) | |||||||
|  |  | ||||||
| 	if entity and entity.driver | 	if entity and entity.driver | ||||||
| 	and entity.driver == player then | 	and entity.driver == player then | ||||||
|  |  | ||||||
| 		entity.driver = nil | 		entity.driver = nil | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	player:set_detach() | 	player:set_detach() | ||||||
| 	default.player_attached[player:get_player_name()] = false |  | ||||||
|  | 	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_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) | ||||||
| 	default.player_set_animation(player, "stand" , 30) | 	player:set_properties({visual_size = {x = 1, y = 1}}) | ||||||
| 	player:set_properties({visual_size = {x = 1, y = 1} }) |  | ||||||
|  |  | ||||||
| end | end | ||||||
|  |  | ||||||
| ------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_on_leaveplayer(function(player) | minetest.register_on_leaveplayer(function(player) | ||||||
| 	force_detach(player) | 	force_detach(player) | ||||||
| end) | end) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_on_shutdown(function() | minetest.register_on_shutdown(function() | ||||||
|  |  | ||||||
| 	local players = minetest.get_connected_players() | 	local players = minetest.get_connected_players() | ||||||
|  |  | ||||||
| 	for i = 1, #players do | 	for i = 1, #players do | ||||||
| 		force_detach(players[i]) | 		force_detach(players[i]) | ||||||
| 	end | 	end | ||||||
| end) | end) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_on_dieplayer(function(player) | minetest.register_on_dieplayer(function(player) | ||||||
| 	force_detach(player) | 	force_detach(player) | ||||||
| 	return true | 	return true | ||||||
| end) | 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}, | ||||||
|  | 		{x = -1, y = 0, z =  0}, | ||||||
|  | 		{x = -1, y = 1, z =  0}, | ||||||
|  | 		{x = 0,  y = 0, z =  1}, | ||||||
|  | 		{x = 0,  y = 1, z =  1}, | ||||||
|  | 		{x = 0,  y = 0, z = -1}, | ||||||
|  | 		{x = 0,  y = 1, z = -1} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	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 | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	return pos | ||||||
|  | end | ||||||
|  |  | ||||||
|  |  | ||||||
| function mobs.attach(entity, player) | function mobs.attach(entity, player) | ||||||
|  |  | ||||||
| 	local attach_at, eye_offset = {}, {} |  | ||||||
|  |  | ||||||
| 	entity.player_rotation = entity.player_rotation or {x = 0, y = 0, z = 0} | 	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_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} | 	entity.driver_eye_offset = entity.driver_eye_offset or {x = 0, y = 0, z = 0} | ||||||
| @@ -131,17 +172,23 @@ function mobs.attach(entity, player) | |||||||
| 	local rot_view = 0 | 	local rot_view = 0 | ||||||
|  |  | ||||||
| 	if entity.player_rotation.y == 90 then | 	if entity.player_rotation.y == 90 then | ||||||
| 		rot_view = math.pi / 2 | 		rot_view = pi / 2 | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	attach_at = entity.driver_attach_at | 	local attach_at = entity.driver_attach_at | ||||||
| 	eye_offset = entity.driver_eye_offset | 	local eye_offset = entity.driver_eye_offset | ||||||
|  |  | ||||||
| 	entity.driver = player | 	entity.driver = player | ||||||
|  |  | ||||||
| 	force_detach(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:set_attach(entity.object, "", attach_at, entity.player_rotation) | ||||||
| 	default.player_attached[player:get_player_name()] = true |  | ||||||
| 	player:set_eye_offset(eye_offset, {x = 0, y = 0, z = 0}) | 	player:set_eye_offset(eye_offset, {x = 0, y = 0, z = 0}) | ||||||
|  |  | ||||||
| 	player:set_properties({ | 	player:set_properties({ | ||||||
| @@ -151,64 +198,63 @@ function mobs.attach(entity, player) | |||||||
| 		} | 		} | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	minetest.after(0.2, function(name) | 	minetest.after(0.2, function() | ||||||
| 		local player = minetest.get_player_by_name(name) |  | ||||||
| 		if player then | 		if player and player:is_player() then | ||||||
| 			default.player_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 | ||||||
| 	end, player:get_player_name()) | 	end) | ||||||
|  |  | ||||||
| 	player:set_look_horizontal(entity.object:get_yaw() - rot_view) | 	player:set_look_horizontal(entity.object:get_yaw() - rot_view) | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
| function mobs.detach(player, offset) | function mobs.detach(player) | ||||||
|  |  | ||||||
| 	force_detach(player) | 	force_detach(player) | ||||||
|  |  | ||||||
| 	default.player_set_animation(player, "stand" , 30) | 	minetest.after(0.1, function() | ||||||
|  |  | ||||||
| 	local pos = player:get_pos() | 		if player and player:is_player() then | ||||||
|  |  | ||||||
| 	pos = { | 			local pos = find_free_pos(player:get_pos()) | ||||||
| 		x = pos.x + offset.x, |  | ||||||
| 		y = pos.y + 0.2 + offset.y, | 			pos.y = pos.y + 0.5 | ||||||
| 		z = pos.z + offset.z |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	minetest.after(0.1, function(name, pos) |  | ||||||
| 		local player = minetest.get_player_by_name(name) |  | ||||||
| 		if player then |  | ||||||
| 			player:set_pos(pos) | 			player:set_pos(pos) | ||||||
| 		end | 		end | ||||||
| 	end, player:get_player_name(), pos) | 	end) | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
| function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | ||||||
|  |  | ||||||
| 	local rot_steer, rot_view = math.pi/2, 0 | 	local yaw = entity.object:get_yaw() or 0 | ||||||
|  | 	local rot_view = 0 | ||||||
|  |  | ||||||
| 	if entity.player_rotation.y == 90 then | 	if entity.player_rotation.y == 90 then | ||||||
| 		rot_steer, rot_view = 0, math.pi/2 | 		rot_view = pi / 2 | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	local acce_y = 0 | 	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) | 	entity.v = get_v(velo) * get_sign(entity.v) | ||||||
|  |  | ||||||
| 	-- process controls | 	-- process controls | ||||||
| 	if entity.driver then | 	if entity.driver then | ||||||
|  |  | ||||||
| --print ("---velo", get_v(velo)) |  | ||||||
|  |  | ||||||
| 		local ctrl = entity.driver:get_player_control() | 		local ctrl = entity.driver:get_player_control() | ||||||
|  |  | ||||||
| 		-- move forwards | 		-- move forwards | ||||||
| 		if ctrl.up then | 		if ctrl.up then | ||||||
|  |  | ||||||
| 			entity.v = entity.v + entity.accel / 10 | 			entity.v = entity.v + entity.accel * dtime | ||||||
|  |  | ||||||
| 		-- move backwards | 		-- move backwards | ||||||
| 		elseif ctrl.down then | 		elseif ctrl.down then | ||||||
| @@ -217,37 +263,58 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | |||||||
| 				return | 				return | ||||||
| 			end | 			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 | ||||||
|  | 				horz = horz + 0.05 | ||||||
|  |  | ||||||
|  | 			elseif ctrl.right then | ||||||
|  | 				horz = horz - 0.05 | ||||||
|  | 			end | ||||||
|  | 		else | ||||||
|  | 			horz = entity.driver:get_look_horizontal() or 0 | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		-- fix mob rotation |  | ||||||
| 		local horz = entity.driver:get_look_horizontal() or 0 |  | ||||||
| 		entity.object:set_yaw(horz - entity.rotate) | 		entity.object:set_yaw(horz - entity.rotate) | ||||||
|  |  | ||||||
| 		if can_fly then | 		if can_fly then | ||||||
|  |  | ||||||
| 			-- fly up | 			-- fly up | ||||||
| 			if ctrl.jump then | 			if ctrl.jump then | ||||||
|  |  | ||||||
| 				velo.y = velo.y + 1 | 				velo.y = velo.y + 1 | ||||||
|  |  | ||||||
| 				if velo.y > entity.accel then velo.y = entity.accel end | 				if velo.y > entity.accel then velo.y = entity.accel end | ||||||
|  |  | ||||||
| 			elseif velo.y > 0 then | 			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 | 				if velo.y < 0 then velo.y = 0 end | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			-- fly down | 			-- fly down | ||||||
| 			if ctrl.sneak then | 			if ctrl.sneak then | ||||||
|  |  | ||||||
| 				velo.y = velo.y - 1 | 				velo.y = velo.y - 1 | ||||||
|  |  | ||||||
| 				if velo.y < -entity.accel then velo.y = -entity.accel end | 				if velo.y < -entity.accel then velo.y = -entity.accel end | ||||||
|  |  | ||||||
| 			elseif velo.y < 0 then | 			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 | 				if velo.y > 0 then velo.y = 0 end | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 		else | 		else | ||||||
|  |  | ||||||
| 			-- jump | 			-- jump | ||||||
| 			if ctrl.jump then | 			if ctrl.jump then | ||||||
|  |  | ||||||
| @@ -283,24 +350,23 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | |||||||
|  |  | ||||||
| 		entity.object:set_velocity({x = 0, y = 0, z = 0}) | 		entity.object:set_velocity({x = 0, y = 0, z = 0}) | ||||||
| 		entity.v = 0 | 		entity.v = 0 | ||||||
|  |  | ||||||
| 		return | 		return | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	-- enforce speed limit forward and reverse | 	-- enforce speed limit forward and reverse | ||||||
| 	local max_spd = entity.max_speed_reverse | 	if entity.v > entity.max_speed_forward then | ||||||
|  | 		entity.v = entity.max_speed_forward | ||||||
| 	if get_sign(entity.v) >= 0 then | 	elseif entity.v < -entity.max_speed_reverse then | ||||||
| 		max_spd = entity.max_speed_forward | 		entity.v = -entity.max_speed_reverse | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	if math.abs(entity.v) > max_spd then |  | ||||||
| 		entity.v = entity.v - get_sign(entity.v) |  | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	-- Set position, velocity and acceleration | 	-- Set position, velocity and acceleration | ||||||
| 	local p = entity.object:get_pos() | 	local p = entity.object:get_pos() | ||||||
| 	local new_velo |  | ||||||
| 	local new_acce = {x = 0, y = -9.8, z = 0} | 	if not p then return end | ||||||
|  |  | ||||||
|  | 	local new_acce = {x = 0, y = entity.fall_speed, z = 0} | ||||||
|  |  | ||||||
| 	p.y = p.y - 0.5 | 	p.y = p.y - 0.5 | ||||||
|  |  | ||||||
| @@ -335,8 +401,9 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | |||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if entity.terrain_type == 2 | 		local terrain_type = entity.terrain_type | ||||||
| 		or entity.terrain_type == 3 then |  | ||||||
|  | 		if terrain_type == 2 or terrain_type == 3 then | ||||||
|  |  | ||||||
| 			new_acce.y = 0 | 			new_acce.y = 0 | ||||||
| 			p.y = p.y + 1 | 			p.y = p.y + 1 | ||||||
| @@ -351,9 +418,13 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | |||||||
| 					new_acce.y = 5 | 					new_acce.y = 5 | ||||||
| 				end | 				end | ||||||
| 			else | 			else | ||||||
| 				if math.abs(velo.y) < 1 then | 				if abs(velo.y) < 1 then | ||||||
|  |  | ||||||
| 					local pos = entity.object:get_pos() | 					local pos = entity.object:get_pos() | ||||||
| 					pos.y = math.floor(pos.y) + 0.5 |  | ||||||
|  | 					if not pos then return end | ||||||
|  |  | ||||||
|  | 					pos.y = floor(pos.y) + 0.5 | ||||||
| 					entity.object:set_pos(pos) | 					entity.object:set_pos(pos) | ||||||
| 					velo.y = 0 | 					velo.y = 0 | ||||||
| 				end | 				end | ||||||
| @@ -363,48 +434,29 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) | |||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	new_velo = get_velocity(v, entity.object:get_yaw() - rot_view, velo.y) | 	local new_velo = get_velocity(v, yaw - rot_view, velo.y) | ||||||
|  |  | ||||||
| 	new_acce.y = new_acce.y + acce_y | 	new_acce.y = new_acce.y + acce_y | ||||||
|  |  | ||||||
| 	entity.object:set_velocity(new_velo) | 	entity.object:set_velocity(new_velo) | ||||||
| 	entity.object:set_acceleration(new_acce) | 	entity.object:set_acceleration(new_acce) | ||||||
|  |  | ||||||
| 	-- CRASH! |  | ||||||
| 	if enable_crash then |  | ||||||
|  |  | ||||||
| 		local intensity = entity.v2 - v |  | ||||||
|  |  | ||||||
| 		if intensity >= crash_threshold then |  | ||||||
|  |  | ||||||
| --print("----------- crash", intensity) |  | ||||||
|  |  | ||||||
| 			entity.object:punch(entity.object, 1.0, { |  | ||||||
| 				full_punch_interval = 1.0, |  | ||||||
| 				damage_groups = {fleshy = intensity} |  | ||||||
| 			}, nil) |  | ||||||
|  |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	entity.v2 = v | 	entity.v2 = v | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
| -- directional flying routine by D00Med (edited by TenPlus1) | -- directional flying routine by D00Med (edited by TenPlus1) | ||||||
|  | function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim) | ||||||
|  |  | ||||||
| function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) | 	local ctrl = entity.driver:get_player_control() ; if not ctrl then return end | ||||||
|  |  | ||||||
| 	local ctrl = entity.driver:get_player_control() |  | ||||||
| 	local velo = entity.object:get_velocity() | 	local velo = entity.object:get_velocity() | ||||||
| 	local dir = entity.driver:get_look_dir() | 	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 | ||||||
| 	local rot_steer, rot_view = math.pi / 2, 0 |  | ||||||
|  |  | ||||||
| 	if entity.player_rotation.y == 90 then | 	if not ctrl or not velo then return end | ||||||
| 		rot_steer, rot_view = 0, math.pi / 2 |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	if ctrl.up then | 	if ctrl.up then | ||||||
|  |  | ||||||
| 		entity.object:set_velocity({ | 		entity.object:set_velocity({ | ||||||
| 			x = dir.x * speed, | 			x = dir.x * speed, | ||||||
| 			y = dir.y * speed + 2, | 			y = dir.y * speed + 2, | ||||||
| @@ -412,9 +464,10 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) | |||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
| 	elseif ctrl.down then | 	elseif ctrl.down then | ||||||
|  |  | ||||||
| 		entity.object:set_velocity({ | 		entity.object:set_velocity({ | ||||||
| 			x = -dir.x * speed, | 			x = -dir.x * speed, | ||||||
| 			y = dir.y * speed + 2, | 			y =  dir.y * speed + 2, | ||||||
| 			z = -dir.z * speed | 			z = -dir.z * speed | ||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
| @@ -422,7 +475,7 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) | |||||||
| 		entity.object:set_velocity({x = 0, y = -2, z = 0}) | 		entity.object:set_velocity({x = 0, y = -2, z = 0}) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	entity.object:set_yaw(yaw + math.pi + math.pi / 2 - entity.rotate) | 	entity.object:set_yaw(yaw + pi + pi / 2 - entity.rotate) | ||||||
|  |  | ||||||
| 	-- firing arrows | 	-- firing arrows | ||||||
| 	if ctrl.LMB and ctrl.sneak and shoots then | 	if ctrl.LMB and ctrl.sneak and shoots then | ||||||
| @@ -434,12 +487,16 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) | |||||||
| 			z = pos.z + 0 + dir.z * 2.5}, arrow) | 			z = pos.z + 0 + dir.z * 2.5}, arrow) | ||||||
|  |  | ||||||
| 		local ent = obj:get_luaentity() | 		local ent = obj:get_luaentity() | ||||||
|  |  | ||||||
| 		if ent then | 		if ent then | ||||||
|  |  | ||||||
| 			ent.switch = 1 -- for mob specific arrows | 			ent.switch = 1 -- for mob specific arrows | ||||||
| 			ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding | 			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} | 			local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6} | ||||||
| 			local yaw = entity.driver:get_look_horizontal() |  | ||||||
| 			obj:set_yaw(yaw + math.pi / 2) | 			yaw = entity.driver:get_look_horizontal() | ||||||
|  |  | ||||||
|  | 			obj:set_yaw(yaw + pi / 2) | ||||||
| 			obj:set_velocity(vec) | 			obj:set_velocity(vec) | ||||||
| 		else | 		else | ||||||
| 			obj:remove() | 			obj:remove() | ||||||
| @@ -448,7 +505,6 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) | |||||||
|  |  | ||||||
| 	-- change animation if stopped | 	-- change animation if stopped | ||||||
| 	if velo.x == 0 and velo.y == 0 and velo.z == 0 then | 	if velo.x == 0 and velo.y == 0 and velo.z == 0 then | ||||||
|  |  | ||||||
| 		mobs:set_animation(entity, stand_anim) | 		mobs:set_animation(entity, stand_anim) | ||||||
| 	else | 	else | ||||||
| 		-- moving animation | 		-- moving animation | ||||||
|   | |||||||
| @@ -23,7 +23,11 @@ Lucky Blocks: 9 | |||||||
|  |  | ||||||
|  |  | ||||||
| Changelog: | Changelog: | ||||||
| - 1.52 - Added 'mob_active_limit' in settings to set number of mobs in game | - 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, | ||||||
| (default is 0 for unlimited), removed {immortal} from mob armor, fluid viscocity slows mobs | (default is 0 for unlimited), removed {immortal} from mob armor, fluid viscocity slows mobs | ||||||
| - 1.51 - Added some node checks for dangerous nodes, jumping and falling tweaks, spawn area check (thx for idea wuzzy), re-enabled mob suffocation, add 'mob_nospawn_range' setting | - 1.51 - Added some node checks for dangerous nodes, jumping and falling tweaks, spawn area check (thx for idea wuzzy), re-enabled mob suffocation, add 'mob_nospawn_range' setting | ||||||
| - 1.50 - Added new line_of_sight function that uses raycasting if mt5.0 is found,  (thanks Astrobe), dont spawn mobs if world anchor nearby (technic or simple_anchor mods), chinese local added | - 1.50 - Added new line_of_sight function that uses raycasting if mt5.0 is found,  (thanks Astrobe), dont spawn mobs if world anchor nearby (technic or simple_anchor mods), chinese local added | ||||||
|   | |||||||
| @@ -13,6 +13,9 @@ mobs_griefing (Griefing Mobs) bool true | |||||||
| #    If false then Mobs no longer spawn inside player protected areas | #    If false then Mobs no longer spawn inside player protected areas | ||||||
| mobs_spawn_protected (Spawn Mobs in protected areas) bool true | 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 | #    If true Mobs will be removed once a map chunk is out of view | ||||||
| remove_far_mobs (Remove far Mobs) bool true | remove_far_mobs (Remove far Mobs) bool true | ||||||
|  |  | ||||||
| @@ -33,3 +36,12 @@ mob_nospawn_range (Mob no-spawn range) float 12.0 | |||||||
|  |  | ||||||
| #    Sets maximum number of active mobs in game (0 for unlimited) | #    Sets maximum number of active mobs in game (0 for unlimited) | ||||||
| mob_active_limit (Mob Active Limit) float 0 | mob_active_limit (Mob Active Limit) float 0 | ||||||
|  |  | ||||||
|  | #    Enables area check when spawning mobs | ||||||
|  | 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 | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								spawner.lua
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								spawner.lua
									
									
									
									
									
								
							| @@ -23,9 +23,9 @@ minetest.register_node("mobs:spawner", { | |||||||
|  |  | ||||||
| 		-- text entry formspec | 		-- text entry formspec | ||||||
| 		meta:set_string("formspec", | 		meta:set_string("formspec", | ||||||
| 			"size[9,3.5]" | 			"size[10,3.5]" | ||||||
| 			.. "label[0.15,0.5;" .. minetest.formspec_escape(head) .. "]" | 			.. "label[0.15,0.5;" .. minetest.formspec_escape(head) .. "]" | ||||||
| 			.. "field[1,2.5;7.5,0.8;text;" .. S("Command:") | 			.. "field[1,2.5;8.5,0.8;text;" .. S("Command:") | ||||||
| 			.. ";${command}]") | 			.. ";${command}]") | ||||||
|  |  | ||||||
| 		meta:set_string("infotext", S("Spawner Not Active (enter settings)")) | 		meta:set_string("infotext", S("Spawner Not Active (enter settings)")) | ||||||
| @@ -162,10 +162,17 @@ minetest.register_abm({ | |||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
|  | 		-- set medium mob usually spawns in (defaults to air) | ||||||
|  | 		local reg = minetest.registered_entities[mob].fly_in | ||||||
|  |  | ||||||
|  | 		if not reg or type(reg) == "string" then | ||||||
|  | 			reg = {(reg or "air")} | ||||||
|  | 		end | ||||||
|  |  | ||||||
| 		-- find air blocks within 5 nodes of spawner | 		-- find air blocks within 5 nodes of spawner | ||||||
| 		local air = minetest.find_nodes_in_area( | 		local air = minetest.find_nodes_in_area( | ||||||
| 			{x = pos.x - 5, y = pos.y + yof, z = pos.z - 5}, | 			{x = pos.x - 5, y = pos.y + yof, z = pos.z - 5}, | ||||||
| 			{x = pos.x + 5, y = pos.y + yof, z = pos.z + 5}, {"air"}) | 			{x = pos.x + 5, y = pos.y + yof, z = pos.z + 5}, reg) | ||||||
|  |  | ||||||
| 		-- spawn in random air block | 		-- spawn in random air block | ||||||
| 		if air and #air > 0 then | 		if air and #air > 0 then | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								textures/mobs_meat_bottom.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								textures/mobs_meat_bottom.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 253 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/mobs_meat_side.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								textures/mobs_meat_side.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 271 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/mobs_meat_top.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								textures/mobs_meat_top.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 287 B | 
							
								
								
									
										
											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