From 1f0969e6d374bf089728b1995e97a97b06b2f111 Mon Sep 17 00:00:00 2001 From: TenPlus1 Date: Fri, 10 Mar 2017 16:05:37 +0000 Subject: [PATCH] Update do_jump function, tidied code --- api.lua | 173 +++++++++++--------------------------------------------- api.txt | 7 +-- 2 files changed, 35 insertions(+), 145 deletions(-) diff --git a/api.lua b/api.lua index 1030095..1903d27 100644 --- a/api.lua +++ b/api.lua @@ -1,5 +1,5 @@ --- Mobs Api (7th March 2017) +-- Mobs Api (10th March 2017) mobs = {} mobs.mod = "redo" @@ -99,27 +99,13 @@ do_attack = function(self, player) end -set_yaw = function(self, yaw) - - if yaw ~= yaw then --- print ("--- yaw nan") - return - end - - self.yaw = yaw -- + self.rotate - self.object:setyaw(self.yaw) -end - - set_velocity = function(self, v) local yaw = self.object:getyaw() + self.rotate self.object:setvelocity({ --- x = sin(self.yaw) * -v, x = sin(yaw) * -v, y = self.object:getvelocity().y, --- z = cos(self.yaw) * v z = cos(yaw) * v }) end @@ -228,7 +214,6 @@ end -- are we flying in what we are suppose to? (taikedz) local function flight_check(self, pos_w) --- local nod = minetest.get_node(pos_w).name local nod = self.standing_in if type(self.fly_in) == "string" @@ -249,41 +234,6 @@ local function flight_check(self, pos_w) end --- check line of sight for walkers and swimmers alike (deprecated) -function line_of_sight_water(self, pos1, pos2, stepsize) - - local s, pos_w = minetest.line_of_sight(pos1, pos2, stepsize) - - -- normal walking and flying mobs can see you through air - if s == true then - return true - end - - -- swimming mobs can see you through water - if s == false - and self.fly - and self.fly_in == "default:water_source" then - - local nod = minetest.get_node(pos_w).name - - if nod == "default:water_source" - or nod == "default:water_flowing" then - - return true - end - - -- just incase we have a special node for flying/swimming mobs - elseif s == false - and self.fly - and flight_check(self, pos_w) then - return true - end - - return false - -end - - -- particle effects function effect(pos, amount, texture, min_size, max_size, radius, gravity) @@ -364,7 +314,6 @@ function check_for_death(self) if show_health then self.htimer = 2 - --self.nametag = "health: " .. self.health .. " of " .. self.hp_max self.nametag = "♥ " .. self.health .. " / " .. self.hp_max update_tag(self) @@ -459,8 +408,6 @@ local function is_at_cliff(self) end local yaw = self.object:getyaw() --- local dir_x = -sin(self.yaw) * (self.collisionbox[4] + 0.5) --- local dir_z = cos(self.yaw) * (self.collisionbox[4] + 0.5) local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) local pos = self.object:getpos() @@ -561,7 +508,6 @@ do_env_damage = function(self) self.health = self.health - self.water_damage effect(pos, 5, "bubble.png", nil, nil, 1, nil) --- end -- lava or fire elseif self.lava_damage ~= 0 @@ -591,9 +537,18 @@ end -- jump if facing a solid node (not fences or gates) do_jump = function(self) - if self.fly + if not self.jump + or self.jump_height == 0 + or self.fly or self.child then - return + return false + end + + -- something stopping us while moving? + if self.state ~= "stand" + and get_velocity(self) > 0.5 + and self.object:getvelocity().y ~= 0 then + return false end local pos = self.object:getpos() @@ -607,12 +562,10 @@ do_jump = function(self) --print ("standing on:", nod.name, pos.y) if minetest.registered_nodes[nod.name].walkable == false then - return + return false end -- where is front --- local dir_x = -sin(self.yaw) * (self.collisionbox[4] + 0.5) --- local dir_z = cos(self.yaw) * (self.collisionbox[4] + 0.5) local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) @@ -625,7 +578,7 @@ do_jump = function(self) -- thin blocks that do not need to be jumped if nod.name == "default:snow" then - return + return false end --print ("in front:", nod.name, pos.y + 0.5) @@ -637,12 +590,18 @@ do_jump = function(self) local v = self.object:getvelocity() - v.y = self.jump_height + 1 + v.y = self.jump_height -- + 1 + + set_animation(self, "jump") -- only when defined self.object:setvelocity(v) mob_sound(self, self.sounds.jump) + + return true end + + return false end @@ -951,7 +910,7 @@ function smart_mobs(self, s, p, dist, dtime) p1.y = floor(p1.y + 0.5) p1.z = floor(p1.z + 0.5) - self.path.way = minetest.find_path(s, p1, 16, 2, 6, "Dijkstra") --"A*_noprefetch") + self.path.way = minetest.find_path(s, p1, 16, 2, 6, "Dijkstra") -- attempt to unstick mob that is "daydreaming" self.object:setpos({ @@ -1000,9 +959,7 @@ function smart_mobs(self, s, p, dist, dtime) else -- dig 2 blocks to make door toward player direction --- local yaw1 = self.yaw + pi / 2 local yaw1 = self.object:getyaw() + pi / 2 - local p1 = { x = s.x + cos(yaw1), y = s.y, @@ -1128,7 +1085,6 @@ local monster_attack = function(self) -- field of view check goes here -- choose closest player to attack --- if line_of_sight_water(self, sp, p, 2) == true if line_of_sight(self, sp, p, 2) == true and dist < min_dist then min_dist = dist @@ -1256,27 +1212,16 @@ local follow_flop = function(self) z = p.z - s.z } --- local yaw = atan2(vec.z, vec.x) - pi / 2 local yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if p.x > s.x then yaw = yaw + pi end self.object:setyaw(yaw) --- set_yaw(self, yaw) -- anyone but standing npc's can move along if dist > self.reach and self.order ~= "stand" then - if (self.jump - and get_velocity(self) <= 0.5 - and self.object:getvelocity().y == 0) - or (self.object:getvelocity().y == 0 - and self.jump_chance > 0) then - - do_jump(self) - end - set_velocity(self, self.walk_velocity) if self.walk_chance ~= 0 then @@ -1339,7 +1284,7 @@ end -- execute current state (stand, walk, run, attacks) local do_states = function(self, dtime) - local yaw = 0 -- self.yaw + local yaw = 0 if self.state == "stand" then @@ -1365,17 +1310,14 @@ local do_states = function(self, dtime) z = lp.z - s.z } --- yaw = atan2(vec.z, vec.x) - pi / 2 yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if lp.x > s.x then yaw = yaw + pi end else --- yaw = random() * 2 * pi yaw = (random(0, 360) - 180) / 180 * pi end self.object:setyaw(yaw) --- set_yaw(self, yaw) end set_velocity(self, 0) @@ -1434,12 +1376,10 @@ local do_states = function(self, dtime) z = lp.z - s.z } --- yaw = atan2(vec.z, vec.x) + pi / 2 yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if lp.x > s.x then yaw = yaw + pi end else --- yaw = random() * 2 * pi yaw = (random(0, 360) - 180) / 180 * pi end @@ -1450,14 +1390,12 @@ local do_states = function(self, dtime) z = lp.z - s.z } --- yaw = atan2(vec.z, vec.x) + pi / 2 yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if lp.x > s.x then yaw = yaw + pi end end self.object:setyaw(yaw) --- set_yaw(self, yaw) -- otherwise randomly turn elseif random(1, 100) <= 30 then @@ -1465,21 +1403,11 @@ local do_states = function(self, dtime) yaw = random() * 2 * pi self.object:setyaw(yaw) --- set_yaw(self, yaw) end -- stand for great fall in front local temp_is_cliff = is_at_cliff(self) - -- jump when walking comes to a halt - if temp_is_cliff == false - and self.jump - and get_velocity(self) <= 0.5 - and self.object:getvelocity().y == 0 then - - do_jump(self) - end - if temp_is_cliff or random(1, 100) <= 30 then @@ -1516,14 +1444,6 @@ local do_states = function(self, dtime) set_animation(self, "walk") end - -- jump when walking comes to a halt - if self.jump - and get_velocity(self) <= 0.5 - and self.object:getvelocity().y == 0 then - - do_jump(self) - end - -- attack routines (explode, dogfight, shoot, dogshoot) elseif self.state == "attack" then @@ -1558,13 +1478,11 @@ local do_states = function(self, dtime) z = p.z - s.z } --- yaw = atan2(vec.z, vec.x) - pi / 2 yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if p.x > s.x then yaw = yaw + pi end self.object:setyaw(yaw) --- set_yaw(self, yaw) if dist > self.reach then @@ -1578,12 +1496,6 @@ local do_states = function(self, dtime) self.timer = 0 self.blinktimer = 0 - if get_velocity(self) <= 0.5 - and self.object:getvelocity().y == 0 then - - do_jump(self) - end - set_velocity(self, self.run_velocity) end @@ -1631,7 +1543,7 @@ local do_states = function(self, dtime) pos.y = pos.y - 1 - mobs:explosion(pos, radius, 0, 1, self.sounds.explode) + mobs:explosion(pos, radius, 1, 1, self.sounds.explode) self.object:remove() @@ -1653,7 +1565,6 @@ local do_states = function(self, dtime) local p_y = floor(p2.y + 1) local v = self.object:getvelocity() --- if nod.name == self.fly_in then if flight_check(self, s) then if me_y < p_y then @@ -1726,13 +1637,11 @@ local do_states = function(self, dtime) z = p.z - s.z } --- yaw = atan2(vec.z, vec.x) - pi / 2 yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if p.x > s.x then yaw = yaw + pi end self.object:setyaw(yaw) --- set_yaw(self, yaw) -- move towards enemy if beyond mob reach if dist > self.reach then @@ -1744,16 +1653,6 @@ local do_states = function(self, dtime) smart_mobs(self, s, p, dist, dtime) end - -- jump attack - if (self.jump - and get_velocity(self) <= 0.5 - and self.object:getvelocity().y == 0) - or (self.object:getvelocity().y == 0 - and self.jump_chance > 0) then - - do_jump(self) - end - if is_at_cliff(self) then set_velocity(self, 0) @@ -1793,10 +1692,9 @@ local do_states = function(self, dtime) local p2 = p local s2 = s - p2.y = p2.y + .5--1.5 - s2.y = s2.y + .5--1.5 + p2.y = p2.y + .5 + s2.y = s2.y + .5 --- if line_of_sight_water(self, p2, s2) == true then if line_of_sight(self, p2, s2) == true then -- play attack sound @@ -1838,13 +1736,11 @@ local do_states = function(self, dtime) z = p.z - s.z } --- yaw = atan2(vec.z, vec.x) - pi / 2 yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate if p.x > s.x then yaw = yaw + pi end self.object:setyaw(yaw) --- set_yaw(self, yaw) set_velocity(self, 0) @@ -1928,7 +1824,7 @@ local falling = function(self, pos) if self.fall_damage == 1 and self.object:getvelocity().y == 0 then - local d = (self.old_y or 0) - self.object:getpos().y -- remove or 0 + local d = (self.old_y or 0) - self.object:getpos().y if d > 5 then @@ -2119,7 +2015,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) yaw = yaw + pi end - set_yaw(self, yaw) + self.object:setyaw(yaw) self.state = "runaway" self.runaway_timer = 0 self.following = nil @@ -2256,7 +2152,6 @@ local mob_activate = function(self, staticdata, dtime_s, def) -- set anything changed above self.object:set_properties(self) --- set_yaw(self, random() * 2 * pi) self.object:setyaw((random(0, 360) - 180) / 180 * pi) update_tag(self) end @@ -2265,7 +2160,6 @@ end local mob_step = function(self, dtime) local pos = self.object:getpos() --- local yaw = self.yaw local yaw = 0 -- when lifetimer expires remove mob (except npc and tamed) @@ -2370,6 +2264,8 @@ local mob_step = function(self, dtime) follow_flop(self) + do_jump(self) + do_states(self, dtime) end @@ -2398,9 +2294,6 @@ function mobs:register_mob(name, def) minetest.register_entity(name, { ---automatic_face_movement_dir = def.rotate and math.rad(def.rotate) or false, ---automatic_face_movement_max_rotation_per_sec = -1, - stepheight = def.stepheight or 0.6, name = name, type = def.type, @@ -2412,7 +2305,6 @@ minetest.register_entity(name, { on_die = def.on_die, do_custom = def.do_custom, jump_height = def.jump_height or 6, - jump_chance = def.jump_chance or 0, drawtype = def.drawtype, -- DEPRECATED, use rotate instead rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 lifetimer = def.lifetimer or 180, -- 3 minutes @@ -2441,7 +2333,7 @@ minetest.register_entity(name, { sounds = def.sounds or {}, animation = def.animation, follow = def.follow, - jump = def.jump or true, + jump = def.jump ~= false, walk_chance = def.walk_chance or 50, attacks_monsters = def.attacks_monsters or false, group_attack = def.group_attack or false, @@ -2523,7 +2415,7 @@ minetest.register_entity(name, { local tmp = {} - for _,stat in pairs(self) do + for _,stat in ipairs(self) do local t = type(stat) @@ -2897,7 +2789,6 @@ function mobs:register_arrow(name, def) local node = node_ok(pos).name if minetest.registered_nodes[node].walkable then - --if node ~= "air" then self.hit_node(self, pos, node) diff --git a/api.txt b/api.txt index fac6ed5..f47f9b8 100644 --- a/api.txt +++ b/api.txt @@ -1,5 +1,5 @@ -MOB API (7th March 2017) +MOB API (10th March 2017) The mob api is a function that can be called on by other mods to add new animals or monsters into minetest. @@ -42,14 +42,13 @@ This functions registers a new mob as a Minetest entity. 'makes_footstep_sound' same is in minetest.register_entity() 'follow' item when held will cause mob to follow player, can be single string "default:apple" or table {"default:apple", "default:diamond"} 'view_range' the range in that the monster will see the playerand follow him - 'walk_chance' chance of mob walking around - 'jump_chance' chance of mob jumping around, set above to 0 for jumping mob only + 'walk_chance' chance of mob walking around, set above to 0 for jumping mob only 'walk_velocity' the velocity when the monster is walking around 'run_velocity' the velocity when the monster is attacking a player 'runaway' when true mob will turn and run away when punched 'stepheight' minimum node height mob can walk onto without jumping (default: 0.6) 'jump' can mob jump, true or false - 'jump_height' height mob can jump, default is 6 + 'jump_height' height mob can jump, default is 6 (0 to disable jump) 'fly' can mob fly, true or false (used for swimming mobs also) 'fly_in' node name that mob flys inside, e.g "air", "default:water_source" for fish 'damage' the damage per second