New upstream snapshot.
Debian Janitor
2 years ago
0 | -- Load support for intllib. | |
1 | 0 | local MP = minetest.get_modpath(minetest.get_current_modname()) |
2 | local S = minetest.get_translator and minetest.get_translator("mobs_redo") or | |
3 | dofile(MP .. "/intllib.lua") | |
1 | ||
2 | -- Check for translation method | |
3 | local S | |
4 | if minetest.get_translator ~= nil then | |
5 | S = minetest.get_translator("mobs") -- 5.x translation function | |
6 | else | |
7 | if minetest.get_modpath("intllib") then | |
8 | dofile(minetest.get_modpath("intllib") .. "/init.lua") | |
9 | if intllib.make_gettext_pair then | |
10 | gettext, ngettext = intllib.make_gettext_pair() -- new gettext method | |
11 | else | |
12 | gettext = intllib.Getter() -- old text file method | |
13 | end | |
14 | S = gettext | |
15 | else -- boilerplate function | |
16 | S = function(str, ...) | |
17 | local args = {...} | |
18 | return str:gsub("@%d+", function(match) | |
19 | return args[tonumber(match:sub(2))] | |
20 | end) | |
21 | end | |
22 | end | |
23 | end | |
4 | 24 | |
5 | 25 | -- CMI support check |
6 | 26 | local use_cmi = minetest.global_exists("cmi") |
7 | 27 | |
8 | 28 | mobs = { |
9 | 29 | mod = "redo", |
10 | version = "20210920", | |
30 | version = "20220314", | |
11 | 31 | intllib = S, |
12 | 32 | invis = minetest.global_exists("invisibility") and invisibility or {} |
13 | 33 | } |
253 | 273 | return true |
254 | 274 | end |
255 | 275 | |
256 | if str:find("group:") then | |
257 | ||
258 | local group = str:split(":")[2] | |
276 | if str and str:find("group:") then | |
277 | ||
278 | local group = str:split(":")[2] or "" | |
259 | 279 | |
260 | 280 | if minetest.get_item_group(look_for, group) ~= 0 then |
261 | 281 | return true |
764 | 784 | end |
765 | 785 | |
766 | 786 | self.infotext = "Health: " .. self.health .. " / " .. self.hp_max |
767 | .. "\n" .. "Owner: " .. self.owner | |
787 | .. (self.owner == "" and "" or "\n" .. "Owner: " .. self.owner) | |
768 | 788 | .. text |
769 | 789 | |
770 | 790 | -- set changes |
1001 | 1021 | |
1002 | 1022 | |
1003 | 1023 | -- Returns true is node can deal damage to self |
1004 | local is_node_dangerous = function(self, nodename) | |
1005 | ||
1006 | if self.water_damage > 0 | |
1024 | function mobs:is_node_dangerous(mob_object, nodename) | |
1025 | ||
1026 | if mob_object.water_damage > 0 | |
1007 | 1027 | and minetest.get_item_group(nodename, "water") ~= 0 then |
1008 | 1028 | return true |
1009 | 1029 | end |
1010 | 1030 | |
1011 | if self.lava_damage > 0 | |
1031 | if mob_object.lava_damage > 0 | |
1012 | 1032 | and minetest.get_item_group(nodename, "lava") ~= 0 then |
1013 | 1033 | return true |
1014 | 1034 | end |
1015 | 1035 | |
1016 | if self.fire_damage > 0 | |
1036 | if mob_object.fire_damage > 0 | |
1017 | 1037 | and minetest.get_item_group(nodename, "fire") ~= 0 then |
1018 | 1038 | return true |
1019 | 1039 | end |
1023 | 1043 | end |
1024 | 1044 | |
1025 | 1045 | return false |
1046 | end | |
1047 | ||
1048 | local function is_node_dangerous(mob_object, nodename) | |
1049 | return mobs:is_node_dangerous(mob_object, nodename) | |
1026 | 1050 | end |
1027 | 1051 | |
1028 | 1052 | |
2107 | 2131 | |
2108 | 2132 | for n = 1, #players do |
2109 | 2133 | |
2110 | if get_distance(players[n]:get_pos(), s) < self.view_range | |
2134 | if players[n] and get_distance(players[n]:get_pos(), s) < self.view_range | |
2111 | 2135 | and not is_invisible(self, players[n]:get_player_name()) then |
2112 | 2136 | |
2113 | 2137 | self.following = players[n] |
4336 | 4360 | if def and def.on_rightclick then |
4337 | 4361 | |
4338 | 4362 | return def.on_rightclick( |
4339 | pointed_thing.under, under, placer, itemstack) | |
4363 | pointed_thing.under, under, placer, itemstack, pointed_thing) | |
4340 | 4364 | end |
4341 | 4365 | |
4342 | 4366 | if pos |
4387 | 4411 | if def and def.on_rightclick then |
4388 | 4412 | |
4389 | 4413 | return def.on_rightclick( |
4390 | pointed_thing.under, under, placer, itemstack) | |
4414 | pointed_thing.under, under, placer, itemstack, pointed_thing) | |
4391 | 4415 | end |
4392 | 4416 | |
4393 | 4417 | if pos |
690 | 690 | otherwise nil is returned. |
691 | 691 | |
692 | 692 | |
693 | mobs:is_node_dangerous(mob_object, nodename) | |
694 | ||
695 | This function returns true if the node name given is harmful to the mob (mob_object), | |
696 | it is mainly used when a mob is near a node it has to avoid. | |
697 | ||
698 | ||
693 | 699 | External Settings for "minetest.conf" |
694 | 700 | ------------------------------------ |
695 | 701 |
0 | minetest-mod-mobs-redo (20210923+git20220314.1.fb42be6-1) UNRELEASED; urgency=low | |
1 | ||
2 | * New upstream snapshot. | |
3 | ||
4 | -- Debian Janitor <janitor@jelmer.uk> Sat, 19 Mar 2022 14:44:49 -0000 | |
5 | ||
0 | 6 | minetest-mod-mobs-redo (20210923-1) unstable; urgency=medium |
1 | 7 | |
2 | 8 | * Switch to debhelper-compat, level 13. |
21 | 21 | -- Lucky Blocks |
22 | 22 | dofile(path .. "/lucky_block.lua") |
23 | 23 | |
24 | minetest.log("action", "[MOD] Mobs Redo loaded") | |
24 | print("[MOD] Mobs Redo loaded") |
10 | 10 | "PO-Revision-Date: 2017-07-02 14:27+0200\n" |
11 | 11 | "Last-Translator: Wuzzy <almikes@aol.com>\n" |
12 | 12 | "Language-Team: \n" |
13 | "Language: de_DE\n" | |
13 | "Language: de\n" | |
14 | 14 | "MIME-Version: 1.0\n" |
15 | 15 | "Content-Type: text/plain; charset=UTF-8\n" |
16 | 16 | "Content-Transfer-Encoding: 8bit\n" |
0 | # textdomain:mobs | |
1 | #** Peaceful Mode Active - No Monsters Will Spawn= | |
2 | @1 (Tamed)=@1 (Gezähmt) | |
3 | @1 at full health (@2)=@1 bei voller Gesundheit (@2) | |
4 | @1 has been tamed!=@1 wurde gezähmt! | |
5 | @1 is owner!=@1 ist der Besitzer! | |
6 | #Active Mob Limit Reached!= | |
7 | Already protected!=Bereits geschützt! | |
8 | #Change= | |
9 | #Command:= | |
10 | Enter name:=Namen eingeben: | |
11 | #Enter texture:= | |
12 | Lasso (right-click animal to put in inventory)=Lasso (Rechtsklick auf Tier, um es zu nehmen) | |
13 | Leather=Leder | |
14 | Meat=Fleisch | |
15 | Missed!=Daneben! | |
16 | Mob Fence=Kreaturen Zaun | |
17 | #Mob Fence Top= | |
18 | Mob Protection Rune=Kreaturschutzrune | |
19 | #Mob Reset Stick= | |
20 | #Mob Spawner= | |
21 | Mob Spawner settings failed!=Kreaturenspawner-Einstellungen gescheitert! | |
22 | Mob has been protected!=Kreatur wurde geschützt! | |
23 | Name Tag=Namensschild | |
24 | Net (right-click animal to put in inventory)=Netz (Rechtsklick auf Tier, um es zu nehmen) | |
25 | Not tamed!=Nicht gezähmt! | |
26 | Raw Meat=Rohes Fleisch | |
27 | Rename=Umbenennen | |
28 | Saddle=Sattel | |
29 | Spawner Active (@1)=Spawner aktiv (@1) | |
30 | Spawner Not Active (enter settings)=Nicht aktiv (Einstellungen eingeben) | |
31 | Steel Shears (right-click to shear)=Stahlschere (Rechtsklick zum Scheren) | |
32 | #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]”= | |
33 | #lifetimer expired, removed @1= |
0 | # textdomain:mobs | |
1 | #** Peaceful Mode Active - No Monsters Will Spawn= | |
2 | @1 (Tamed)=@1 (Gezähmt) | |
3 | @1 at full health (@2)=@1 bei voller Gesundheit (@2) | |
4 | @1 has been tamed!=@1 wurde gezähmt! | |
5 | @1 is owner!=@1 ist der Besitzer! | |
6 | #Active Mob Limit Reached!= | |
7 | Already protected!=Bereits geschützt! | |
8 | #Change= | |
9 | #Command:= | |
10 | Enter name:=Namen eingeben: | |
11 | #Enter texture:= | |
12 | Lasso (right-click animal to put in inventory)=Lasso (Rechtsklick auf Tier, um es zu nehmen) | |
13 | Leather=Leder | |
14 | Meat=Fleisch | |
15 | Missed!=Daneben! | |
16 | Mob Fence=Kreaturen Zaun | |
17 | #Mob Fence Top= | |
18 | Mob Protection Rune=Kreaturschutzrune | |
19 | #Mob Reset Stick= | |
20 | #Mob Spawner= | |
21 | Mob Spawner settings failed!=Kreaturenspawner-Einstellungen gescheitert! | |
22 | Mob has been protected!=Kreatur wurde geschützt! | |
23 | Name Tag=Namensschild | |
24 | Net (right-click animal to put in inventory)=Netz (Rechtsklick auf Tier, um es zu nehmen) | |
25 | Not tamed!=Nicht gezähmt! | |
26 | Raw Meat=Rohes Fleisch | |
27 | Rename=Umbenennen | |
28 | Saddle=Sattel | |
29 | Spawner Active (@1)=Spawner aktiv (@1) | |
30 | Spawner Not Active (enter settings)=Nicht aktiv (Einstellungen eingeben) | |
31 | Steel Shears (right-click to shear)=Stahlschere (Rechtsklick zum Scheren) | |
32 | #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]”= | |
33 | #lifetimer expired, removed @1= |
0 | 0 | name = mobs |
1 | 1 | depends = |
2 | optional_depends = default, tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks, pathfinder | |
2 | optional_depends = default, tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks, pathfinder, player_api | |
3 | 3 | description = Adds a mob api for mods to add animals or monsters etc. |
0 | 0 | -- lib_mount by Blert2112 (edited by TenPlus1) |
1 | ||
2 | local is_50 = minetest.get_modpath("player_api") -- 5.x compatibility | |
1 | 3 | |
2 | 4 | local abs, cos, floor, sin, sqrt, pi = |
3 | 5 | math.abs, math.cos, math.floor, math.sin, math.sqrt, math.pi |
4 | ------------------------------------------------------------------------------ | |
5 | 6 | |
6 | 7 | -- |
7 | 8 | -- Helper functions |
8 | 9 | -- |
9 | 10 | |
10 | 11 | local node_ok = function(pos, fallback) |
12 | ||
11 | 13 | fallback = fallback or mobs.fallback_node |
12 | 14 | |
13 | 15 | local node = minetest.get_node_or_nil(pos) |
45 | 47 | |
46 | 48 | |
47 | 49 | local function get_sign(i) |
50 | ||
48 | 51 | i = i or 0 |
49 | 52 | |
50 | 53 | if i == 0 then |
56 | 59 | |
57 | 60 | |
58 | 61 | local function get_velocity(v, yaw, y) |
62 | ||
59 | 63 | local x = -sin(yaw) * v |
60 | 64 | local z = cos(yaw) * v |
61 | 65 | |
69 | 73 | |
70 | 74 | |
71 | 75 | local function force_detach(player) |
76 | ||
77 | if not player then return end | |
72 | 78 | |
73 | 79 | local attached_to = player:get_attach() |
74 | 80 | |
84 | 90 | end |
85 | 91 | |
86 | 92 | player:set_detach() |
87 | player_api.player_attached[player:get_player_name()] = false | |
93 | ||
94 | local name = player:get_player_name() | |
95 | ||
96 | if is_50 then | |
97 | player_api.player_attached[name] = false | |
98 | player_api.set_animation(player, "stand", 30) | |
99 | else | |
100 | default.player_attached[name] = false | |
101 | default.player_set_animation(player, "stand", 30) | |
102 | end | |
103 | ||
88 | 104 | player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) |
89 | player_api.set_animation(player, "stand", 30) | |
90 | 105 | player:set_properties({visual_size = {x = 1, y = 1}}) |
91 | ||
92 | end | |
93 | ||
94 | ------------------------------------------------------------------------------- | |
106 | end | |
107 | ||
95 | 108 | |
96 | 109 | minetest.register_on_leaveplayer(function(player) |
97 | 110 | force_detach(player) |
98 | 111 | end) |
99 | 112 | |
113 | ||
100 | 114 | minetest.register_on_shutdown(function() |
101 | 115 | |
102 | 116 | local players = minetest.get_connected_players() |
105 | 119 | force_detach(players[i]) |
106 | 120 | end |
107 | 121 | end) |
122 | ||
108 | 123 | |
109 | 124 | minetest.register_on_dieplayer(function(player) |
110 | 125 | force_detach(player) |
111 | 126 | return true |
112 | 127 | end) |
113 | 128 | |
114 | ------------------------------------------------------------------------------- | |
115 | 129 | |
116 | 130 | -- Just for correct detaching |
117 | 131 | local function find_free_pos(pos) |
146 | 160 | return pos |
147 | 161 | end |
148 | 162 | |
149 | ------------------------------------------------------------------------------- | |
150 | 163 | |
151 | 164 | function mobs.attach(entity, player) |
152 | 165 | |
168 | 181 | |
169 | 182 | force_detach(player) |
170 | 183 | |
184 | if is_50 then | |
185 | player_api.player_attached[player:get_player_name()] = true | |
186 | else | |
187 | default.player_attached[player:get_player_name()] = true | |
188 | end | |
189 | ||
171 | 190 | player:set_attach(entity.object, "", attach_at, entity.player_rotation) |
172 | player_api.player_attached[player:get_player_name()] = true | |
173 | 191 | player:set_eye_offset(eye_offset, {x = 0, y = 0, z = 0}) |
174 | 192 | |
175 | 193 | player:set_properties({ |
182 | 200 | minetest.after(0.2, function() |
183 | 201 | |
184 | 202 | if player and player:is_player() then |
185 | player_api.set_animation(player, "sit", 30) | |
203 | ||
204 | if is_50 then | |
205 | player_api.set_animation(player, "sit", 30) | |
206 | else | |
207 | default.player_set_animation(player, "sit", 30) | |
208 | end | |
186 | 209 | end |
187 | 210 | end) |
188 | 211 | |
191 | 214 | |
192 | 215 | |
193 | 216 | function mobs.detach(player) |
217 | ||
194 | 218 | force_detach(player) |
195 | 219 | |
196 | 220 | minetest.after(0.1, function() |
217 | 241 | end |
218 | 242 | |
219 | 243 | local acce_y = 0 |
220 | local velo = entity.object:get_velocity() | |
244 | local velo = entity.object:get_velocity() ; if not velo then return end | |
221 | 245 | |
222 | 246 | entity.v = get_v(velo) * get_sign(entity.v) |
223 | 247 | |
261 | 285 | entity.object:set_yaw(horz - entity.rotate) |
262 | 286 | |
263 | 287 | if can_fly then |
288 | ||
264 | 289 | -- fly up |
265 | 290 | if ctrl.jump then |
266 | 291 | |
426 | 451 | -- directional flying routine by D00Med (edited by TenPlus1) |
427 | 452 | function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim) |
428 | 453 | |
429 | local ctrl = entity.driver:get_player_control() | |
454 | local ctrl = entity.driver:get_player_control() ; if not ctrl then return end | |
430 | 455 | local velo = entity.object:get_velocity() |
431 | 456 | local dir = entity.driver:get_look_dir() |
432 | local yaw = entity.driver:get_look_horizontal() + 1.57 -- offset fix between old and new commands | |
433 | ||
434 | if not ctrl or not velo then return end | |
457 | local yaw = entity.driver:get_look_horizontal() + 1.57 | |
458 | ||
459 | if not ctrl or not velo then return end | |
435 | 460 | |
436 | 461 | if ctrl.up then |
462 | ||
437 | 463 | entity.object:set_velocity({ |
438 | 464 | x = dir.x * speed, |
439 | 465 | y = dir.y * speed + 2, |