diff --git a/data/occupations/default.lua b/data/occupations/default.lua new file mode 100644 index 0000000..1f844c9 --- /dev/null +++ b/data/occupations/default.lua @@ -0,0 +1,150 @@ +---------------------------------------------------- +-- Default occupation for Advanced NPC +-- By Zorman2000 +---------------------------------------------------- +-- The default "occupation" gives some schedule entries to the NPCs +-- which don't have any occupation. The rest is left as randomly +-- initialized. + +local basic_def = { + -- Use random textures + textures = {}, + -- Use random dialogues + dialogues = {}, + -- Initialize inventory with random items + initial_inventory = {}, + -- Initialize schedule + schedules_entries = { + -- Schedule entry for 7 in the morning + [7] = { + -- Get out of bed + [1] = {task = npc.actions.cmd.USE_BED, args = { + pos = npc.places.PLACE_TYPE.BED.PRIMARY, + action = npc.actions.const.beds.GET_UP + } + }, + -- Walk to home inside + [2] = {task = npc.actions.cmd.WALK_TO_POS, args = { + end_pos = npc.places.PLACE_TYPE.OTHER.HOME_INSIDE, + walkable = {} + }, + chance = 75 + }, + -- Allow mobs_redo wandering + [3] = {action = npc.actions.cmd.FREEZE, args = {freeze = false}} + }, + -- Schedule entry for 7 in the morning + [8] = { + -- Walk to outside of home + [1] = {task = npc.actions.cmd.WALK_TO_POS, args = { + end_pos = npc.places.PLACE_TYPE.OTHER.HOME_OUTSIDE, + walkable = {} + }, + chance = 75 + }, + -- Allow mobs_redo wandering + [2] = {action = npc.actions.cmd.FREEZE, args = {freeze = false}} + }, + -- Schedule entry for 12 midday + [12] = { + -- Walk to a sittable node + [1] = {task = npc.actions.cmd.WALK_TO_POS, args = { + end_pos = {place_type=npc.places.PLACE_TYPE.SITTABLE.PRIMARY, use_access_node=true}, + walkable = {"cottages:bench"} + }, + chance = 75 + }, + -- Sit on the node + [2] = {task = npc.actions.cmd.USE_SITTABLE, args = { + pos = npc.places.PLACE_TYPE.SITTABLE.PRIMARY, + action = npc.actions.const.sittable.SIT + }, + depends = {1} + }, + -- Stay put into place + [3] = {action = npc.actions.cmd.SET_INTERVAL, args = { + freeze = true, + interval = 35 + }, + depends = {2} + }, + [4] = {action = npc.actions.cmd.SET_INTERVAL, args = { + freeze = true, + interval = npc.actions.default_interval + }, + depends = {3} + }, + -- Get up from sit + [5] = {action = npc.actions.cmd.USE_SITTABLE, args = { + pos = npc.places.PLACE_TYPE.SITTABLE.PRIMARY, + action = npc.actions.const.sittable.GET_UP + }, + depends = {4} + } + }, + -- Schedule entry for 1 in the afternoon + [13] = { + -- Give NPC money to buy from player + [1] = {property = npc.schedule_properties.put_multiple_items, args = { + itemlist = { + {name="default:iron_lump", random=true, min=2, max=4} + } + }, + chance = 75 + }, + -- Change trader status to "trader" + [2] = {property = npc.schedule_properties.trader_status, args = { + status = npc.trade.TRADER + }, + chance = 75 + }, + [3] = {property = npc.schedule_properties.can_receive_gifts, args = { + can_receive_gifts = false + }, + depends = {1} + }, + -- Allow mobs_redo wandering + [4] = {action = npc.actions.cmd.FREEZE, args = {freeze = false}} + }, + -- Schedule entry for 6 in the evening + [18] = { + -- Change trader status to "none" + [1] = {property = npc.schedule_properties.trader_status, args = { + status = npc.trade.NONE + } + }, + -- Enable gift receiving again + [2] = {property = npc.schedule_properties.can_receive_gifts, args = { + can_receive_gifts = true + } + }, + -- Get inside home + [3] = {task = npc.actions.cmd.WALK_TO_POS, args = { + end_pos = npc.places.PLACE_TYPE.OTHER.HOME_INSIDE, + walkable = {} + } + }, + -- Allow mobs_redo wandering + [4] = {action = npc.actions.cmd.FREEZE, args = {freeze = false}} + }, + -- Schedule entry for 10 in the evening + [22] = { + [1] = {task = npc.actions.cmd.WALK_TO_POS, args = { + end_pos = {place_type=npc.places.PLACE_TYPE.BED.PRIMARY, use_access_node=true}, + walkable = {} + } + }, + -- Use bed + [2] = {task = npc.actions.cmd.USE_BED, args = { + pos = npc.places.PLACE_TYPE.BED.PRIMARY, + action = npc.actions.const.beds.LAY + } + }, + -- Stay put on bed + [3] = {action = npc.actions.cmd.FREEZE, args = {freeze = true}} + } + } +} + +-- Register default occupation +npc.occupations.register_occupation(npc.occupations.basic_name, basic_def) \ No newline at end of file diff --git a/data/occupations/default_farmer.lua b/data/occupations/default_farmer.lua new file mode 100644 index 0000000..7d7ee52 --- /dev/null +++ b/data/occupations/default_farmer.lua @@ -0,0 +1,73 @@ +---------------------------------------------------- +-- Test farmer occupation for Advanced NPC +-- By Zorman2000 +---------------------------------------------------- +-- This farmer implementation is still WIP. It is supposed to spawn +-- on buildings that have plots or there are fields nearby. Also, it +-- work on its crops during the morning, and sell some of them on the +-- afternoon. + +local farmer_def = { + dialogues = {}, + textures = {}, + initial_inventory = {}, + schedule_entries = { + [7] = { + [1] = + { + task = npc.actions.cmd.WALK_TO_POS, + args = { + end_pos = npc.places.PLACE_TYPE.OTHER.HOME_OUTSIDE, + walkable = {} + } + }, + [2] = + { + check = true, + range = 2, + random_execution_times = true, + min_count = 10, + max_count = 12, + nodes = {"farming:cotton_3"}, + actions = + { + -- Actions for grown cotton - harvest and replant + ["farming:cotton_3"] = + { + [1] = + { + action = npc.actions.cmd.WALK_STEP, + }, + [2] = + { + action = npc.actions.cmd.DIG, + }, + [3] = + { + action = npc.actions.cmd.PLACE, + args = + { + node = "farming:cotton_1" + } + } + } + + }, + none_actions = + { + -- Walk a single step in a random direction + [1] = { + action = npc.actions.cmd.WALK_STEP, + args = + { + dir = "random" + } + }, + } + } + } + } +} + +-- Register occupation +npc.occupations.register_occupation("test_farmer", farmer_def) \ No newline at end of file diff --git a/data/occupations/default_priest.lua b/data/occupations/default_priest.lua new file mode 100644 index 0000000..fa8b588 --- /dev/null +++ b/data/occupations/default_priest.lua @@ -0,0 +1,197 @@ +---------------------------------------------------- +-- Basic priest occupation for Advanced NPC (WIP) +-- By Zorman2000 +---------------------------------------------------- +-- The basic priest occupation is given to NPCs that spawn on houses +-- surrounding churchs. While on the church, the priest provides +-- universal wisdom and advice, and also heals the player a limited number of times. +-- DISCLAIMER: The "teachings" in this file come from a compilation of 15 principles shared +-- among religions around the world. Zorman2000 and other contributors are not +-- necessarily aligned with the principles and morals in these teachings, nor affiliated +-- to religions that promote them. + +local priest_def = { + dialogues = { + type = "given", + data = { + { + text = "Blessings be upon you, my child!", + tags = {"unisex"} + }, + { + text = "The temple will always open the doors to everyone.", + tags = {"unisex"} + }, + { + text = "Following the teachings is the path to a good life.", + tags = {"unisex"} + }, + { + text = "Thanks for coming to greet me, I hope you have a blessed day! ", + tags = {"unisex"} + }, + { + text = "Welcome to the temple, how can I help you today?", + flag = {name="on_church", value=true}, + tags = {"unisex"}, + responses = + { + [1] = { + text = "I'm injured. Can you heal me?", + action_type = "function", + action = function(self, player) + local heal_count = self.flags["heal_count"] + if heal_count then + -- Increase heal count + self.flags["heal_count"] = self.flags["heal_count"] + 1 + else + self.flags["heal_count"] = 1 + heal_count = 1 + end + -- Check if heal count is achieved + if heal_count > 5 then + npc.chat(self.npc_name, player:get_player_name(), "I cannot heal you anymore, " + .."my child.\nTo mortals like you and me, the power of the Creator is\n" + .." limited. Only though learning the teachings we are able to understand more" + .."...\nBe safe my child.") + else + npc.chat(self.npc_name, player:get_player_name(), + "Receive the blessings of the Creator!") + effect(self.object:getpos(), 20, "default_coral_skeleton.png", 0.1, 0.3, 3, 10) + -- Heal one heart + player:set_hp(player:get_hp() + 2) + end + end + }, + [2] = { + text = "What are your teachings?", + action_type = "function", + action = function(self, player) + local teachings = { + [1] = "Do unto others what you would have them do unto you", + [2] = "Honor your Father and Mother. Knowing them is the key to knowing ourselves", + [3] = "Sincerity is the way to heaven,\nand to think how to be sincere is the way of the man", + [4] = "Generosity, charity and kindness will open an individual to an unbounded reservoir of riches", + [5] = "Even as the scent dwells within the flower, so God within thine own heart forever abides", + [6] = "Acts of faith, prayer and meditation provide us with the strength that allows love for our fellow man to become an abiding force. Love is unifying.", + [7] = "Peacemakers are blessed.\nPeace is the natural result of individuals and nations living in close kinship", + [8] = "You reap what you sow.\nEven if it is a mystery, we are all ruled by this inevitable law of nature", + [9] = "The blessings of life are deeper than what can be appreciated by the senses", + [10] = "Do no harm, as we are part of the whole, and shouldn't perceive others as foreign or separate from ownself", + [11] = "The most beautiful thing a man can do is to forgive wrong", + [12] = "Judge not, lest ye be judged. Mankind is nothing but a great family and we all spring from common source", + [13] = "Anger clouds the mind in the very moments that clarity and objectivity are needed most.", + [14] = "Nature, Being, The Absolute, Creator... whatever name man chooses, there is but one force in the universe. All people and things are of one essence", + [15] = "Study the words, no doubt, but look behind them to the thought they indicate;\nhaving fond it, throw the words away. Live the spirit of them" + } + npc.chat(self.npc_name, player:get_player_name(), teachings[math.random(1, #teachings)] + ..". \nThese are the teachings of our Creator.") + end + } + } + } + } + }, + textures = { + "npc_male_priest.png" + }, + initial_inventory = { + {name="farming:bread", count=1} + }, + properties = { + initial_trader_status = npc.trade.NONE, + enable_gift_items_hints = false + }, + + building_types = { + "hut", "house", "farm_tiny", "lumberjack" + }, + surrounding_building_types = { + "church" + }, + schedules_entries = { + [7] = { + -- Get out of bed + [1] = { + task = npc.actions.cmd.USE_BED, + args = { + pos = npc.places.PLACE_TYPE.BED.PRIMARY, + action = npc.actions.const.beds.GET_UP + } + }, + -- Walk to home inside + [2] = { + task = npc.actions.cmd.WALK_TO_POS, + chance = 95, + args = { + end_pos = npc.places.PLACE_TYPE.OTHER.HOME_INSIDE, + walkable = {} + } + }, + -- Allow mobs_redo wandering + [3] = {action = npc.actions.cmd.FREEZE, args = {freeze = false}} + }, + [8] = { + -- Walk to workplace + [1] = + { + task = npc.actions.cmd.WALK_TO_POS, + args = { + end_pos = npc.places.PLACE_TYPE.WORKPLACE.PRIMARY, + walkable = {}, + use_access_node = true + } + }, + [2] = + { + property = npc.schedule_properties.flag, + args = { + action = "set", + flag_name = "on_church", + flag_value = true + } + } + }, + [17] = { + [1] = + { + property = npc.schedule_properties.flag, + args = { + action = "set", + flag_name = "on_church", + flag_value = false + } + }, + [2] = + { + task = npc.actions.cmd.WALK_TO_POS, + args = { + end_pos = npc.places.PLACE_TYPE.OTHER.HOME_INSIDE, + walkable = {} + } + } + }, + [21] = { + [1] = { + task = npc.actions.cmd.WALK_TO_POS, + args = { + end_pos = {place_type=npc.places.PLACE_TYPE.BED.PRIMARY, use_access_node=true}, + walkable = {} + } + }, + -- Use bed + [2] = { + task = npc.actions.cmd.USE_BED, + args = { + pos = npc.places.PLACE_TYPE.BED.PRIMARY, + action = npc.actions.const.beds.LAY + } + }, + -- Stay put on bed + [3] = {action = npc.actions.cmd.FREEZE, args = {freeze = true}} + } + } +} + +-- Register occupation +npc.occupations.register_occupation("basic_priest", priest_def) \ No newline at end of file diff --git a/data/occupations_data.lua b/data/occupations_data.lua index 03fd0f7..600f694 100644 --- a/data/occupations_data.lua +++ b/data/occupations_data.lua @@ -1,223 +1,7 @@ --- Occupations definitions --- Register default occupation -npc.occupations.register_occupation(npc.occupations.basic_name, npc.occupations.basic_def) +local path = minetest.get_modpath("advanced_npc") --- Test priest -npc.occupations.register_occupation("test_priest", { - dialogues = { - type = "given", - data = { - { - text = "How are you today my child?", - tags = {"male"} - }, - { - text = "Welcome to the temple, how can I help you today?", - flag = {name="on_church", value=true}, - tags = {"unisex"}, - responses = - { - [1] = { - text = "I'm injured. Can you heal me?", - action_type = "function", - action = function(self, player) - local heal_count = self.flags["heal_count"] - if heal_count then - -- Increase heal count - self.flags["heal_count"] = self.flags["heal_count"] + 1 - else - self.flags["heal_count"] = 1 - heal_count = 1 - end - -- Check if heal count is achieved - if heal_count > 5 then - npc.chat(self.npc_name, player:get_player_name(), "I cannot heal you anymore, " - .."my child. To mortals like you and me, the power of the Creator is " - .." limited. Only though learning the teachings we are able to understand more" - .."... Be safe my child.") - else - npc.chat(self.npc_name, player:get_player_name(), - "Receive the blessings of the Creator!") - effect(self.object:getpos(), 20, "default_coral_skeleton.png", 0.1, 0.3, 3, 10) - -- Heal one heart - player:set_hp(player:get_hp() + 2) - end - end - }, - [2] = { - text = "What are your teachings?", - action_type = "function", - action = function(self, player) - local teachings = { - [1] = "Do unto others what you would have them do unto you.", - [2] = "Sincerity is the way to heaven, and to think how to be sincere is the way of the man", - [3] = "Even as the scent dwells within the flower, so God within thine own heart forever abides" - } - npc.chat(self.npc_name, player:get_player_name(), teachings[math.random(1, #teachings)] - ..". These are the teachings of our Creator.") - end - } - } - } - } - }, - textures = { - "npc_male_priest.png" - }, - initial_inventory = { - {name="farming:bread", count=1} - }, - initial_trader_status = npc.trade.NONE, - building_types = { - "hut", "house", "farm_tiny", "lumberjack" - }, - surrounding_building_types = { - "church" - }, - schedules_entries = { - [7] = { - -- Get out of bed - [1] = { - task = npc.actions.cmd.USE_BED, - args = { - pos = npc.places.PLACE_TYPE.BED.PRIMARY, - action = npc.actions.const.beds.GET_UP - } - }, - -- Walk to home inside - [2] = { - task = npc.actions.cmd.WALK_TO_POS, - chance = 95, - args = { - end_pos = npc.places.PLACE_TYPE.OTHER.HOME_INSIDE, - walkable = {} - } - }, - -- Allow mobs_redo wandering - [3] = {action = npc.actions.cmd.FREEZE, args = {freeze = false}} - }, - [8] = { - -- Walk to workplace - [1] = - { - task = npc.actions.cmd.WALK_TO_POS, - args = { - end_pos = npc.places.PLACE_TYPE.WORKPLACE.PRIMARY, - walkable = {}, - use_access_node = true - } - }, - [2] = - { - property = npc.schedule_properties.flag, - args = { - action = "set", - flag_name = "on_church", - flag_value = true - } - } - }, - [17] = { - [1] = - { - property = npc.schedule_properties.flag, - args = { - action = "set", - flag_name = "on_church", - flag_value = false - } - }, - [2] = - { - task = npc.actions.cmd.WALK_TO_POS, - args = { - end_pos = npc.places.PLACE_TYPE.OTHER.HOME_INSIDE, - walkable = {} - } - } - }, - [21] = { - [1] = { - task = npc.actions.cmd.WALK_TO_POS, - args = { - end_pos = {place_type=npc.places.PLACE_TYPE.BED.PRIMARY, use_access_node=true}, - walkable = {} - } - }, - -- Use bed - [2] = { - task = npc.actions.cmd.USE_BED, - args = { - pos = npc.places.PLACE_TYPE.BED.PRIMARY, - action = npc.actions.const.beds.LAY - } - }, - -- Stay put on bed - [3] = {action = npc.actions.cmd.FREEZE, args = {freeze = true}} - } - } -}) - --- Test farmer -npc.occupations.register_occupation("test_farmer", { - dialogues = {}, - textures = {}, - initial_inventory = {}, - schedule_entries = { - [7] = { - [1] = - { - task = npc.actions.cmd.WALK_TO_POS, - args = { - end_pos = npc.places.PLACE_TYPE.OTHER.HOME_OUTSIDE, - walkable = {} - } - }, - [2] = - { - check = true, - range = 2, - random_execution_times = true, - min_count = 10, - max_count = 12, - nodes = {"farming:cotton_3"}, - actions = - { - -- Actions for grown cotton - harvest and replant - ["farming:cotton_3"] = - { - [1] = - { - action = npc.actions.cmd.WALK_STEP, - }, - [2] = - { - action = npc.actions.cmd.DIG, - }, - [3] = - { - action = npc.actions.cmd.PLACE, - args = - { - node = "farming:cotton_1" - } - } - } - - }, - none_actions = - { - -- Walk a single step in a random direction - [1] = { - action = npc.actions.cmd.WALK_STEP, - args = - { - dir = "random" - } - }, - } - } - } - } -}) \ No newline at end of file +-- This may be temporary for now. +dofile(path.."/data/occupations/default.lua") +dofile(path.."/data/occupations/default_farmer.lua") +dofile(path.."/data/occupations/default_priest.lua") \ No newline at end of file