NPC: (WIP) Schedule properties support adding one or multiple items to NPC inventory, and support taking one item from NPC inventory.
Attempt to fix child textures issue (2).
This commit is contained in:
parent
7110c49b42
commit
cc56446206
56
npc.lua
56
npc.lua
@ -51,7 +51,7 @@ npc.log_level = {
|
|||||||
|
|
||||||
npc.texture_check = {
|
npc.texture_check = {
|
||||||
timer = 0,
|
timer = 0,
|
||||||
interval = 0
|
interval = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
---------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------
|
||||||
@ -149,9 +149,9 @@ local function get_random_texture(sex, age)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Choose whether NPC can have relationships. Only 30% of NPCs cannot have relationships
|
-- Choose whether NPC can have relationships. Only 30% of NPCs cannot have relationships
|
||||||
local function can_have_relationships(age)
|
local function can_have_relationships(is_child)
|
||||||
-- Children can't have relationships
|
-- Children can't have relationships
|
||||||
if not age then
|
if is_child then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
local chance = math.random(1,10)
|
local chance = math.random(1,10)
|
||||||
@ -264,8 +264,8 @@ function npc.initialize(entity, pos, is_lua_entity, npc_stats)
|
|||||||
elseif child_s <= age_chance and age_chance <= child_e then
|
elseif child_s <= age_chance and age_chance <= child_e then
|
||||||
selected_age = npc.age.child
|
selected_age = npc.age.child
|
||||||
ent.visual_size = {
|
ent.visual_size = {
|
||||||
x = 0.5,
|
x = 0.75,
|
||||||
y = 0.5
|
y = 0.75
|
||||||
}
|
}
|
||||||
ent.collisionbox = {-0.10,-0.50,-0.10, 0.10,0.40,0.10}
|
ent.collisionbox = {-0.10,-0.50,-0.10, 0.10,0.40,0.10}
|
||||||
ent.is_child = true
|
ent.is_child = true
|
||||||
@ -310,6 +310,11 @@ function npc.initialize(entity, pos, is_lua_entity, npc_stats)
|
|||||||
-- Flag that determines if NPC can have a relationship
|
-- Flag that determines if NPC can have a relationship
|
||||||
ent.can_have_relationship = can_have_relationships(ent.is_child)
|
ent.can_have_relationship = can_have_relationships(ent.is_child)
|
||||||
|
|
||||||
|
ent.infotext = "Interested in relationships: "..dump(ent.can_have_relationship)
|
||||||
|
|
||||||
|
-- Flag to determine if NPC can receive gifts
|
||||||
|
ent.can_receive_gifts = ent.can_have_relationship
|
||||||
|
|
||||||
-- Initialize relationships object
|
-- Initialize relationships object
|
||||||
ent.relationships = {}
|
ent.relationships = {}
|
||||||
|
|
||||||
@ -763,8 +768,10 @@ npc.schedule_types = {
|
|||||||
|
|
||||||
npc.schedule_properties = {
|
npc.schedule_properties = {
|
||||||
put_item = "put_item",
|
put_item = "put_item",
|
||||||
|
put_multiple_items = "put_multiple_items",
|
||||||
take_item = "take_item",
|
take_item = "take_item",
|
||||||
trader_status = "trader_status"
|
trader_status = "trader_status",
|
||||||
|
can_receive_gifts = "can_receive_gifts"
|
||||||
}
|
}
|
||||||
|
|
||||||
local function get_time_in_hours()
|
local function get_time_in_hours()
|
||||||
@ -892,9 +899,31 @@ function npc.schedule_change_property(self, property, args)
|
|||||||
-- Set status to NPC
|
-- Set status to NPC
|
||||||
npc.set_trading_status(self, status)
|
npc.set_trading_status(self, status)
|
||||||
elseif property == npc.schedule_properties.put_item then
|
elseif property == npc.schedule_properties.put_item then
|
||||||
|
local itemstring = args.itemstring
|
||||||
|
-- Add item
|
||||||
|
npc.add_item_to_inventory_itemstring(self, itemstring)
|
||||||
|
elseif property == npc.schedule_properties.put_multiple_items then
|
||||||
|
local itemlist = args.itemlist
|
||||||
|
for i = 1, #itemlist do
|
||||||
|
local itemlist_entry = itemlist[i]
|
||||||
|
local current_itemstring = itemlist[i].name
|
||||||
|
if itemlist_entry.random == true then
|
||||||
|
current_itemstring = current_itemstring
|
||||||
|
.." "..dump(math.random(itemlist_entry.min, itemlist_entry.max))
|
||||||
|
else
|
||||||
|
current_itemstring = current_itemstring.." "..tostring(itemlist_entry.count)
|
||||||
|
end
|
||||||
|
-- Add item to inventory
|
||||||
|
npc.add_item_to_inventory_itemstring(self, current_itemstring)
|
||||||
|
end
|
||||||
elseif property == npc.schedule_properties.take_item then
|
elseif property == npc.schedule_properties.take_item then
|
||||||
|
local itemstring = args.itemstring
|
||||||
|
-- Add item
|
||||||
|
npc.take_item_from_inventory_itemstring(self, itemstring)
|
||||||
|
elseif property == npc.schedule_properties.can_receive_gifts then
|
||||||
|
local value = args.can_receive_gifts
|
||||||
|
-- Set status
|
||||||
|
self.can_receive_gifts = value
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -976,16 +1005,14 @@ mobs:register_mob("advanced_npc:npc", {
|
|||||||
local item = clicker:get_wielded_item()
|
local item = clicker:get_wielded_item()
|
||||||
local name = clicker:get_player_name()
|
local name = clicker:get_player_name()
|
||||||
|
|
||||||
--self.child = true
|
|
||||||
--self.textures = {"mobs_npc_child_male1.png"}
|
|
||||||
--self.base_texture = "mobs_npc_child_male1.png"
|
|
||||||
--self.object:set_properties(self)
|
|
||||||
--npc.log("INFO", "NPC places: "..dump(self.places_map))
|
|
||||||
npc.log("DEBUG", "Right-clicked NPC: "..dump(self))
|
npc.log("DEBUG", "Right-clicked NPC: "..dump(self))
|
||||||
|
|
||||||
-- Receive gift or start chat. If player has no item in hand
|
-- Receive gift or start chat. If player has no item in hand
|
||||||
-- then it is going to start chat directly
|
-- then it is going to start chat directly
|
||||||
if self.can_have_relationship and item:to_table() ~= nil then
|
minetest.log("self.can_have_relationship: "..dump(self.can_have_relationship)..", self.can_receive_gifts: "..dump(self.can_receive_gifts)..", table: "..dump(item:to_table()))
|
||||||
|
if self.can_have_relationship
|
||||||
|
and self.can_receive_gifts
|
||||||
|
and item:to_table() ~= nil then
|
||||||
-- Get item name
|
-- Get item name
|
||||||
local item = minetest.registered_items[item:get_name()]
|
local item = minetest.registered_items[item:get_name()]
|
||||||
local item_name = item.description
|
local item_name = item.description
|
||||||
@ -1034,6 +1061,7 @@ mobs:register_mob("advanced_npc:npc", {
|
|||||||
self.texture = {self.selected_texture}
|
self.texture = {self.selected_texture}
|
||||||
self.base_texture = {self.selected_texture}
|
self.base_texture = {self.selected_texture}
|
||||||
self.object:set_properties(self)
|
self.object:set_properties(self)
|
||||||
|
npc.log("WARNING", "Corrected textures on NPC child "..dump(self.npc_name))
|
||||||
-- Set interval to large interval so this code isn't called frequently
|
-- Set interval to large interval so this code isn't called frequently
|
||||||
npc.texture_check.interval = 60
|
npc.texture_check.interval = 60
|
||||||
end
|
end
|
||||||
|
27
spawner.lua
27
spawner.lua
@ -109,18 +109,30 @@ local function get_basic_schedule()
|
|||||||
-- Afternoon actions: go inside the house
|
-- Afternoon actions: go inside the house
|
||||||
-- This will be executed around 1 PM MTG time
|
-- This will be executed around 1 PM MTG time
|
||||||
afternoon_actions = {
|
afternoon_actions = {
|
||||||
|
-- Get up of the sit
|
||||||
[1] = {task = npc.actions.cmd.USE_SITTABLE, args = {
|
[1] = {task = npc.actions.cmd.USE_SITTABLE, args = {
|
||||||
pos = npc.places.PLACE_TYPE.SITTABLE.PRIMARY,
|
pos = npc.places.PLACE_TYPE.SITTABLE.PRIMARY,
|
||||||
action = npc.actions.const.sittable.GET_UP
|
action = npc.actions.const.sittable.GET_UP
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
-- Give NPC money to buy from player
|
||||||
|
[2] = {property = npc.schedule_properties.put_multiple_items, args = {
|
||||||
|
itemlist = {
|
||||||
|
{name="default:iron_lump", random=true, min=2, max=4}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
-- Change trader status to "trader"
|
-- Change trader status to "trader"
|
||||||
[2] = {property = npc.schedule_properties.trader_status, args = {
|
[3] = {property = npc.schedule_properties.trader_status, args = {
|
||||||
status = npc.trade.TRADER
|
status = npc.trade.TRADER
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
[4] = {property = npc.schedule_properties.can_receive_gifts, args = {
|
||||||
|
value = true
|
||||||
|
}
|
||||||
|
},
|
||||||
-- Allow mobs_redo wandering
|
-- Allow mobs_redo wandering
|
||||||
[3] = {action = npc.actions.cmd.FREEZE, args = {freeze = false}}
|
[5] = {action = npc.actions.cmd.FREEZE, args = {freeze = false}}
|
||||||
},
|
},
|
||||||
-- Afternoon actions: go inside the house
|
-- Afternoon actions: go inside the house
|
||||||
-- This will be executed around 6 PM MTG time
|
-- This will be executed around 6 PM MTG time
|
||||||
@ -130,13 +142,18 @@ local function get_basic_schedule()
|
|||||||
status = npc.trade.NONE
|
status = npc.trade.NONE
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
-- Enable gift receiving again
|
||||||
|
[2] = {property = npc.schedule_properties.can_receive_gifts, args = {
|
||||||
|
can_receive_gifts = true
|
||||||
|
}
|
||||||
|
},
|
||||||
-- Get inside home
|
-- Get inside home
|
||||||
[2] = {task = npc.actions.cmd.WALK_TO_POS, args = {
|
[3] = {task = npc.actions.cmd.WALK_TO_POS, args = {
|
||||||
end_pos = npc.places.PLACE_TYPE.OTHER.HOME_INSIDE,
|
end_pos = npc.places.PLACE_TYPE.OTHER.HOME_INSIDE,
|
||||||
walkable = {}}
|
walkable = {}}
|
||||||
},
|
},
|
||||||
-- Allow mobs_redo wandering
|
-- Allow mobs_redo wandering
|
||||||
[3] = {action = npc.actions.cmd.FREEZE, args = {freeze = false}}
|
[4] = {action = npc.actions.cmd.FREEZE, args = {freeze = false}}
|
||||||
},
|
},
|
||||||
-- Evening actions: walk to bed and use it.
|
-- Evening actions: walk to bed and use it.
|
||||||
-- This will be executed around 10 PM MTG time
|
-- This will be executed around 10 PM MTG time
|
||||||
|
Loading…
Reference in New Issue
Block a user