Port npcf_guard to the control framework
This commit is contained in:
parent
b10e0b2cbb
commit
0636167680
@ -101,17 +101,12 @@ npcf:register_npc("npcf_guard:npc", {
|
||||
end
|
||||
end,
|
||||
on_step = function(self, dtime)
|
||||
local control = npcf.control_framework.getControl(self)
|
||||
if self.timer > 1 then
|
||||
local pos = self.object:getpos()
|
||||
local yaw = self.object:getyaw()
|
||||
local state = NPCF_ANIM_STAND
|
||||
local target = {object=nil, distance=0}
|
||||
local min_dist = 1000
|
||||
local speed = 0
|
||||
local acceleration = {x=0, y=-10, z=0}
|
||||
local velocity = self.object:getvelocity()
|
||||
local attacking = false
|
||||
for _,object in ipairs(minetest.get_objects_inside_radius(pos, TARGET_RADIUS)) do
|
||||
control:mine_stop()
|
||||
for _,object in ipairs(minetest.get_objects_inside_radius(control.pos, TARGET_RADIUS)) do
|
||||
local to_target = false
|
||||
if object:is_player() then
|
||||
if GUARD_ATTACK_PLAYERS == true and self.metadata.attack_players == "true" then
|
||||
@ -134,10 +129,10 @@ npcf:register_npc("npcf_guard:npc", {
|
||||
end
|
||||
if to_target == true then
|
||||
local op = object:getpos()
|
||||
local dv = vector.subtract(pos, op)
|
||||
local dv = vector.subtract(control.pos, op)
|
||||
local dy = math.abs(dv.y - 1)
|
||||
if dy < math.abs(dv.x) or dy < math.abs(dv.z) then
|
||||
local dist = math.floor(vector.distance(pos, op))
|
||||
local dist = math.floor(vector.distance(control.pos, op))
|
||||
if dist < min_dist then
|
||||
target.object = object
|
||||
target.distance = dist
|
||||
@ -147,19 +142,10 @@ npcf:register_npc("npcf_guard:npc", {
|
||||
end
|
||||
end
|
||||
if target.object then
|
||||
yaw = npcf:get_face_direction(pos, target.object:getpos())
|
||||
if target.distance < 3 then
|
||||
attacking = true
|
||||
state = NPCF_ANIM_MINE
|
||||
end
|
||||
if target.distance > 2 then
|
||||
speed = get_speed(target.distance) * 1.1
|
||||
state = NPCF_ANIM_WALK
|
||||
if attacking == true then
|
||||
state = NPCF_ANIM_WALK_MINE
|
||||
end
|
||||
end
|
||||
if attacking == true then
|
||||
control:mine()
|
||||
control:stay()
|
||||
control:look_to(target.object:getpos())
|
||||
local tool_caps = {full_punch_interval=1.0, damage_groups={fleshy=1}}
|
||||
local item = self.metadata.wielditem
|
||||
if item ~= "" and minetest.registered_items[item] then
|
||||
@ -169,16 +155,21 @@ npcf:register_npc("npcf_guard:npc", {
|
||||
end
|
||||
target.object:punch(self.object, self.var.timer, tool_caps)
|
||||
end
|
||||
if target.distance > 2 then
|
||||
local speed = get_speed(target.distance) * 1.1
|
||||
control:walk(target.object:getpos(), speed)
|
||||
end
|
||||
elseif self.metadata.follow_owner == "true" then
|
||||
local player = minetest.get_player_by_name(self.owner)
|
||||
if player then
|
||||
yaw = npcf:get_face_direction(pos, player:getpos())
|
||||
local p = player:getpos()
|
||||
local distance = vector.distance(pos, {x=p.x, y=pos.y, z=p.z})
|
||||
local distance = vector.distance(control.pos, {x=p.x, y=control.pos.y, z=p.z})
|
||||
if distance > 3 then
|
||||
speed = get_speed(distance)
|
||||
state = NPCF_ANIM_WALK
|
||||
control:walk(p, get_speed(distance))
|
||||
else
|
||||
control:stay()
|
||||
end
|
||||
control:mine_stop()
|
||||
end
|
||||
elseif self.metadata.patrol == "true" then
|
||||
self.var.rest_timer = self.var.rest_timer + self.timer
|
||||
@ -189,40 +180,27 @@ npcf:register_npc("npcf_guard:npc", {
|
||||
end
|
||||
local patrol_pos = self.metadata.patrol_points[index]
|
||||
if patrol_pos then
|
||||
local distance = vector.distance(pos, patrol_pos)
|
||||
local distance = vector.distance(control.pos, patrol_pos)
|
||||
if distance > 1 then
|
||||
yaw = npcf:get_face_direction(pos, patrol_pos)
|
||||
speed = PATROL_SPEED
|
||||
state = NPCF_ANIM_WALK
|
||||
control:walk(patrol_pos, PATROL_SPEED)
|
||||
else
|
||||
self.object:setpos(patrol_pos)
|
||||
control:stay()
|
||||
self.metadata.patrol_index = index
|
||||
self.var.rest_timer = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif vector.equals(pos, self.origin.pos) == false then
|
||||
yaw = npcf:get_face_direction(pos, self.origin.pos)
|
||||
local distance = vector.distance(pos, self.origin.pos)
|
||||
elseif vector.equals(control.pos, self.origin.pos) == false then
|
||||
local distance = vector.distance(control.pos, self.origin.pos)
|
||||
if distance > 1 then
|
||||
speed = get_speed(distance)
|
||||
state = NPCF_ANIM_WALK
|
||||
control:walk(self.origin.pos, get_speed(distance))
|
||||
else
|
||||
self.object:setpos(self.origin.pos)
|
||||
yaw = self.origin.yaw
|
||||
control.look_to(self.origin.pos)
|
||||
control:stay()
|
||||
end
|
||||
end
|
||||
local node = minetest.get_node(pos)
|
||||
if string.find(node.name, "^default:water") then
|
||||
acceleration = {x=0, y=-4, z=0}
|
||||
velocity = {x=0, y=3, z=0}
|
||||
elseif minetest.find_node_near(pos, 2, {"group:water"}) then
|
||||
acceleration = {x=0, y=-1, z=0}
|
||||
end
|
||||
self.object:setvelocity(npcf:get_walk_velocity(speed, velocity.y, yaw))
|
||||
self.object:setacceleration(acceleration)
|
||||
self.object:setyaw(yaw)
|
||||
npcf:set_animation(self, state)
|
||||
self.timer = 0
|
||||
end
|
||||
end,
|
||||
|
Loading…
x
Reference in New Issue
Block a user