Guard NPC improvements, add patrol feature
This commit is contained in:
parent
971444ccdb
commit
f5df4ebf8a
@ -1,6 +1,7 @@
|
||||
local GUARD_ATTACK_PLAYERS
|
||||
local TARGET_RADIUS = 20
|
||||
local MAX_SPEED = 5
|
||||
local PATROL_SPEED = 2
|
||||
|
||||
local function get_wield_image(item)
|
||||
local wield_image = "npcf_trans.png"
|
||||
@ -38,18 +39,53 @@ end
|
||||
|
||||
npcf:register_npc("npcf_guard:npc", {
|
||||
description = "Guard NPC",
|
||||
mesh = "npcf_guard.x",
|
||||
mesh = "npcf_guard.b3d",
|
||||
textures = {"character.png", "npcf_guard_armor.png", "npcf_trans.png"},
|
||||
inventory_image = "npcf_guard_inv.png",
|
||||
stepheight = 1.1,
|
||||
armor_groups = {fleshy=20},
|
||||
metadata = {
|
||||
wielditem = "default:sword_steel",
|
||||
blacklist = "mobs:oerkki mobs:dungeon_master",
|
||||
blacklist = "npcf_mob:npc",
|
||||
whitelist = "",
|
||||
attack_players = "false",
|
||||
follow_owner = "false",
|
||||
patrol = "false",
|
||||
patrol_points = {},
|
||||
patrol_index = 0,
|
||||
patrol_rest = 2,
|
||||
show_armor = "true",
|
||||
},
|
||||
var = {
|
||||
rest_timer = 0,
|
||||
},
|
||||
get_formspec = function(self)
|
||||
local blacklist = minetest.formspec_escape(self.metadata.blacklist)
|
||||
local whitelist = minetest.formspec_escape(self.metadata.whitelist)
|
||||
local formspec = "size[8,8.5]"
|
||||
.."field[0.5,1.0;3.5,0.5;wielditem;Weapon;"..self.metadata.wielditem.."]"
|
||||
.."checkbox[4.0,0.5;show_armor;Show 3D Armor;"..self.metadata.show_armor.."]"
|
||||
.."field[0.5,2.5;7.5.0,0.5;blacklist;Blacklist (Mob Entities);"..blacklist.."]"
|
||||
.."field[0.5,4.0;7.5.0,0.5;whitelist;Whitelist (Player Names);"..whitelist.."]"
|
||||
.."checkbox[0.5,4.5;follow_owner;Follow;"..self.metadata.follow_owner.."]"
|
||||
.."checkbox[3.5,4.5;patrol;Patrol;"..self.metadata.patrol.."]"
|
||||
.."field[6.0,5.5;2.0.0,0.5;rest_time;Rest (sec);"..self.metadata.patrol_rest.."]"
|
||||
.."label[0.5,6.5;Patrol Points: "..#self.metadata.patrol_points.."]"
|
||||
.."button[5.5,6.5;2.5,0.5;add_patrol;Add Point]"
|
||||
.."button[3.5,6.5;2.0,0.5;clear_patrol;Clear]"
|
||||
.."button[0.0,8.0;2.0,0.5;origin;Set Origin]"
|
||||
.."button_exit[7.0,8.0;1.0,0.5;;Ok]"
|
||||
if GUARD_ATTACK_PLAYERS == true then
|
||||
formspec = formspec.."checkbox[4.0,4.5;attack_players;Attack Players;"
|
||||
..self.metadata.attack_players.."]"
|
||||
end
|
||||
return formspec
|
||||
end,
|
||||
on_destruct = function(self, hitter)
|
||||
if self.npc_id then
|
||||
npcf:unload(self.npc_id)
|
||||
end
|
||||
end,
|
||||
on_activate = function(self)
|
||||
self.object:setvelocity({x=0, y=0, z=0})
|
||||
self.object:setacceleration({x=0, y=-10, z=0})
|
||||
@ -59,28 +95,13 @@ npcf:register_npc("npcf_guard:npc", {
|
||||
self.object:set_properties(self.properties)
|
||||
end,
|
||||
on_rightclick = function(self, clicker)
|
||||
local player_name = clicker:get_player_name()
|
||||
if player_name == self.owner then
|
||||
local blacklist = minetest.formspec_escape(self.metadata.blacklist)
|
||||
local whitelist = minetest.formspec_escape(self.metadata.whitelist)
|
||||
local formspec = "size[8,6.5]"
|
||||
.."field[0.5,1.0;3.5,0.5;wielditem;Weapon;"..self.metadata.wielditem.."]"
|
||||
.."checkbox[4.0,0.5;show_armor;Show 3D Armor;"..self.metadata.show_armor.."]"
|
||||
.."field[0.5,2.5;7.5.0,0.5;blacklist;Blacklist (Mob Entities);"..blacklist.."]"
|
||||
.."field[0.5,4.0;7.5.0,0.5;whitelist;Whitelist (Player Names);"..whitelist.."]"
|
||||
.."checkbox[0.5,4.5;follow_owner;Follow;"..self.metadata.follow_owner.."]"
|
||||
.."button[0.0,6.0;2.0,0.5;origin;Set Origin]"
|
||||
.."button_exit[7.0,6.0;1.0,0.5;;Ok]"
|
||||
if GUARD_ATTACK_PLAYERS == true then
|
||||
formspec = formspec.."checkbox[4.0,4.5;attack_players;Attack Players;"
|
||||
..self.metadata.attack_players.."]"
|
||||
end
|
||||
npcf:show_formspec(player_name, self.npc_id, formspec)
|
||||
local name = clicker:get_player_name()
|
||||
if name == self.owner then
|
||||
npcf:show_formspec(name, self.npc_id, self:get_formspec())
|
||||
end
|
||||
end,
|
||||
on_step = function(self, dtime)
|
||||
if self.timer > 1 then
|
||||
self.timer = 0
|
||||
local pos = self.object:getpos()
|
||||
local yaw = self.object:getyaw()
|
||||
local state = NPCF_ANIM_STAND
|
||||
@ -159,6 +180,27 @@ npcf:register_npc("npcf_guard:npc", {
|
||||
state = NPCF_ANIM_WALK
|
||||
end
|
||||
end
|
||||
elseif self.metadata.patrol == "true" then
|
||||
self.var.rest_timer = self.var.rest_timer + self.timer
|
||||
if self.var.rest_timer > self.metadata.patrol_rest then
|
||||
local index = self.metadata.patrol_index + 1
|
||||
if index > #self.metadata.patrol_points then
|
||||
index = 1
|
||||
end
|
||||
local patrol_pos = self.metadata.patrol_points[index]
|
||||
if patrol_pos then
|
||||
local distance = vector.distance(pos, patrol_pos)
|
||||
if distance > 1 then
|
||||
yaw = npcf:get_face_direction(pos, patrol_pos)
|
||||
speed = PATROL_SPEED
|
||||
state = NPCF_ANIM_WALK
|
||||
else
|
||||
self.object:setpos(patrol_pos)
|
||||
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)
|
||||
@ -181,10 +223,12 @@ npcf:register_npc("npcf_guard:npc", {
|
||||
self.object:setacceleration(acceleration)
|
||||
self.object:setyaw(yaw)
|
||||
npcf:set_animation(self, state)
|
||||
self.timer = 0
|
||||
end
|
||||
end,
|
||||
on_receive_fields = function(self, fields, sender)
|
||||
if self.owner == sender:get_player_name() then
|
||||
local name = sender:get_player_name()
|
||||
if self.owner == name then
|
||||
if fields.wielditem then
|
||||
local wield_image = get_wield_image(fields.wielditem)
|
||||
local textures = {self.properties.textures[1], get_armor_texture(self), wield_image}
|
||||
@ -194,6 +238,24 @@ npcf:register_npc("npcf_guard:npc", {
|
||||
self.origin.pos = self.object:getpos()
|
||||
self.origin.yaw = self.object:getyaw()
|
||||
end
|
||||
if fields.follow_owner then
|
||||
self.metadata.patrol = "false"
|
||||
elseif fields.patrol then
|
||||
if fields.patrol == "false" then
|
||||
self.metadata.patrol_index = 0
|
||||
end
|
||||
self.metadata.follow_owner = "false"
|
||||
elseif fields.add_patrol then
|
||||
local pos = self.object:getpos()
|
||||
if pos then
|
||||
table.insert(self.metadata.patrol_points, pos)
|
||||
end
|
||||
elseif fields.clear_patrol then
|
||||
self.metadata.patrol_points = {}
|
||||
else
|
||||
return
|
||||
end
|
||||
npcf:show_formspec(name, self.npc_id, self:get_formspec())
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
BIN
npcf_guard/models/npcf_guard.b3d
Normal file
BIN
npcf_guard/models/npcf_guard.b3d
Normal file
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user