mirror of
				https://gitea.your-land.de/Sokomine/yl_speak_up.git
				synced 2025-10-31 12:23:07 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			274 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| yl_speak_up = {}
 | |
| 
 | |
| -- some mods (i.e. yl_speak_up_addons) need to be called again when
 | |
| -- this mod is reloaded via chat command "/npc_talk_reload";
 | |
| -- this is a list of such functions
 | |
| yl_speak_up.inform_when_reloaded = {}
 | |
| 
 | |
| yl_speak_up.register_on_reload = function(fun, desc)
 | |
| 	-- avoid double entries
 | |
| 	for i, f in ipairs(yl_speak_up.inform_when_reloaded) do
 | |
| 		if(f == fun) then
 | |
| 			return
 | |
| 		end
 | |
| 	end
 | |
| 	table.insert(yl_speak_up.inform_when_reloaded, fun)
 | |
| 	minetest.log("action","[MOD] yl_speak_up Will execute function \""..tostring(desc)..
 | |
| 		"\" on each reload.")
 | |
| 	-- execute it once so that the calling mod doesn't have to do that manually
 | |
| 	fun()
 | |
| end
 | |
| 
 | |
| 
 | |
| local modpath = minetest.get_modpath("yl_speak_up")..DIR_DELIM
 | |
| yl_speak_up.worldpath = minetest.get_worldpath()..DIR_DELIM
 | |
| yl_speak_up.modpath = modpath
 | |
| 
 | |
| yl_speak_up.modstorage = minetest.get_mod_storage()
 | |
| 
 | |
| -- status
 | |
| -- 0: NPCs may speak
 | |
| -- 1: NPCs may not speak
 | |
| -- 2: NPCs must selfdestruct on load. Their dialogs remain safed
 | |
| yl_speak_up.status = yl_speak_up.modstorage:get_int("status") or 0
 | |
| 
 | |
| -- needed for assigning individual IDs (n_id) to NPC
 | |
| yl_speak_up.number_of_npcs = yl_speak_up.modstorage:get_int("amount") or 0
 | |
| 
 | |
| -- we need to know how many quests exist in this world;
 | |
| -- if a quest shall be copied to a new world, its variable needs to be created
 | |
| -- manually first, then a quest beeing created, and *then* the quest file copied
 | |
| yl_speak_up.number_of_quests = yl_speak_up.modstorage:get_int("max_quest_nr") or 0
 | |
| 
 | |
| -- which player (key) is talking to which NPC?
 | |
| yl_speak_up.speak_to = {}
 | |
| 
 | |
| -- allow to request the highest possible version number for formspec_version
 | |
| -- for each individual player; formspec_version...
 | |
| --    ver 1 looks very bad because button height can't be set)
 | |
| --    ver 2 works pretty well because the code has workarounds for the scroll elements
 | |
| --    ver 3 is what this was developed with and looks best
 | |
| yl_speak_up.fs_version = {}
 | |
| 
 | |
| -- used for storing custom functions only this server may have
 | |
| yl_speak_up.custom_server_functions = {}
 | |
| 
 | |
| -- may store a table of registered mobs in the future; currently not really used
 | |
| yl_speak_up.mob_table = {}
 | |
| 
 | |
| -- the real implementation happens in interface_mobs_api.lua
 | |
| -- mob implementations may need this at an earlier point
 | |
| yl_speak_up.mobs_on_rightclick = function(self, clicker)
 | |
| 	if(not(yl_speak_up.do_mobs_on_rightclick)) then
 | |
| 		return false
 | |
| 	end
 | |
| 	return yl_speak_up.do_mobs_on_rightclick(self, clicker)
 | |
| end
 | |
| 
 | |
| yl_speak_up.mobs_after_activate = function(self, staticdata, def, dtime)
 | |
| 	if(not(yl_speak_up.do_mobs_after_activate)) then
 | |
| 		return false
 | |
| 	end
 | |
| 	return yl_speak_up.do_mobs_after_activate(self, staticdata, def, dtime)
 | |
| end
 | |
| 
 | |
| -- Some files may or may not exist on the server - they contain adjustments
 | |
| -- local to the server.
 | |
| -- Here you can override what you need for YOUR SERVER.
 | |
| -- Note: These files here are NOT part of the git repository and will NOT be
 | |
| --       overwritten when the mod is updated. You need to maintain them
 | |
| --       yourself for your server!
 | |
| -- This is a local function for security reasons.
 | |
| local yl_speak_up_execute_if_file_exists = function(reason)
 | |
| 	local file_name = ""
 | |
| 	if(reason == "config") then
 | |
| 		-- This mod is configured through a config file. Here in this
 | |
| 		-- file you can keep and maintain your own local config.
 | |
| 		--
 | |
| 		-- This file will be loaded and executed (if it exists) at
 | |
| 		-- startup AND each time when the command /npc_talk_reload
 | |
| 		-- is given.
 | |
| 		file_name = modpath.."local_server_config.lua"
 | |
| 	elseif(reason == "reload") then
 | |
| 		-- Add functions that exist only on your server. This is for
 | |
| 		-- example useful for overriding and adding functions found
 | |
| 		-- in the file:
 | |
| 		--       custom_functions_you_can_override.lua
 | |
| 		--
 | |
| 		-- This file will be loaded and executed (if it exists) at
 | |
| 		-- startup AND each time when the command /npc_talk_reload
 | |
| 		-- is given.
 | |
| 		file_name = modpath.."local_server_do_on_reload.lua"
 | |
| 	elseif(reason == "startup") then
 | |
| 		-- Add functionality that exists only on your server and that
 | |
| 		-- is exectuted only ONCE when this mod here is LOADED - not
 | |
| 		-- each time the reload command is executed.
 | |
| 		-- This is useful for calling minetest.register_* functions,
 | |
| 		-- i.e. for registering new chat commands.
 | |
| 		file_name = modpath.."local_server_do_once_on_startup.lua"
 | |
| 	else
 | |
| 		-- *only* the file names above are allowed
 | |
| 		return
 | |
| 	end
 | |
| 	-- actually check if the file exists (it's optional after all)
 | |
| 	local file, err = io.open(file_name, "r")
 | |
| 	if(err) then
 | |
| 		minetest.log("action","[MOD] yl_speak_up Ignoring non-existing file \'"..file_name..
 | |
| 				"\' (may contain server-side adjustments).")
 | |
| 		return
 | |
| 	end
 | |
| 	io.close(file)
 | |
| 	minetest.log("action","[MOD] yl_speak_up Found and executing file \'"..file_name..
 | |
| 				"\' with server-side adjustments.")
 | |
| 	dofile(file_name)
 | |
| 
 | |
| end
 | |
| 
 | |
| 
 | |
| -- the functions in here can be reloaded without restarting the server
 | |
| --	log_entry: what to write in the logfile
 | |
| yl_speak_up.reload = function(modpath, log_entry)
 | |
| 	-- the server-specific configuration
 | |
| 	dofile(modpath .. "config.lua")
 | |
| 
 | |
| 	-- Here you can override config values for YOUR SERVER.
 | |
| 	yl_speak_up_execute_if_file_exists("config")
 | |
| 
 | |
| 	-- those paths are set in config.lua - so make sure they exist
 | |
| 	minetest.mkdir(yl_speak_up.worldpath..yl_speak_up.path)
 | |
| 	minetest.mkdir(yl_speak_up.worldpath..yl_speak_up.inventory_path)
 | |
| 	minetest.mkdir(yl_speak_up.worldpath..yl_speak_up.log_path)
 | |
| 	minetest.mkdir(yl_speak_up.worldpath..yl_speak_up.quest_path)
 | |
| 
 | |
| 	-- logging and showing the log
 | |
| 	dofile(modpath .. "fs_show_log.lua")
 | |
| 	-- players *and* npc need privs for certain things; this here handles the NPC side of things
 | |
| 	dofile(modpath .. "npc_privs.lua")
 | |
| 	-- add generic dialogs
 | |
| 	dofile(modpath .. "add_generic_dialogs.lua")
 | |
| 	-- handle on_player_receive_fields and showing of formspecs
 | |
| 	dofile(modpath .. "show_fs.lua")
 | |
| 	-- general decoration part for main formspec, trade window etc.
 | |
| 	dofile(modpath .. "fs_decorated.lua")
 | |
| 	-- the formspec and input handling for the main dialog
 | |
| 	dofile(modpath .. "fs_talkdialog.lua")
 | |
| 	-- ask if the player wants to save, discard or go back in edit mode
 | |
| 	dofile(modpath .. "fs_save_or_discard_or_back.lua")
 | |
| 	-- the player wants to change something regarding the dialog
 | |
| 	dofile(modpath .. "edit_mode_apply_changes.lua")
 | |
| 
 | |
| 	-- As the name says: a collection of custom functions that you can
 | |
| 	-- override on your server or in your game to suit your needs;
 | |
| 	-- Note: No special privs are needed to call custom functions. But...
 | |
| 	--       of course you can change them only if you have access to
 | |
| 	--       the server's file system or can execute lua code.
 | |
| 	-- Note: Please do not edit this file. Instead, create and edit the
 | |
| 	--       file "local_server_do_on_reload.lua"!
 | |
| 	dofile(modpath .. "custom_functions_you_can_override.lua")
 | |
| 
 | |
| 	-- assign a quest step to a dialog option/answer
 | |
| 	dofile(modpath .. "fs_assign_quest_step.lua")
 | |
| 
 | |
| 	-- execute preconditions, actions and effects
 | |
| 	dofile(modpath .. "exec_eval_preconditions.lua")
 | |
| 	dofile(modpath .. "exec_actions.lua")
 | |
| 	dofile(modpath .. "exec_apply_effects.lua")
 | |
| 	-- some helper functions for formatting text for a formspec talbe
 | |
| 	dofile(modpath .. "print_as_table.lua")
 | |
| 	-- create i.e. a dropdown list of player names
 | |
| 	dofile(modpath .. "formspec_helpers.lua")
 | |
| 	-- handle alternate text for dialogs
 | |
| 	dofile(modpath .. "fs_alternate_text.lua")
 | |
| 	-- debugging - extended information about what (your own) NPC does
 | |
| 	dofile(modpath .. "npc_talk_debug.lua")
 | |
| 	-- execute lua code directly (preconditions and effects) - requires priv
 | |
| 	dofile(modpath .. "eval_and_execute_function.lua")
 | |
| 	-- common functions for editing preconditions and effects
 | |
| 	dofile(modpath .. "fs_edit_general.lua")
 | |
| 	-- edit preconditions (can be reached through edit options dialog)
 | |
| 	dofile(modpath .. "fs_edit_preconditions.lua")
 | |
| 	-- edit actions (can be reached through edit options dialog)
 | |
| 	dofile(modpath .. "fs_edit_actions.lua")
 | |
| 	-- edit effects (can be reached through edit options dialog)
 | |
| 	dofile(modpath .. "fs_edit_effects.lua")
 | |
| 	-- edit options dialog (detailed configuration of options in edit mode)
 | |
| 	dofile(modpath .. "fs_edit_options_dialog.lua")
 | |
| 	-- set name, description and owner (owner only with npc_talk_master priv)
 | |
| 	dofile(modpath .. "fs_initial_config.lua")
 | |
| 	-- inspect and accept items the player gave to the NPC
 | |
| 	dofile(modpath .. "fs_player_offers_item.lua")
 | |
| 	-- inventory management, trading and handling of quest items:
 | |
| 	dofile(modpath .. "inventory.lua")
 | |
| 	-- limit how much the NPC shall buy and sell
 | |
| 	dofile(modpath .. "fs_trade_limit.lua")
 | |
| 	dofile(modpath .. "fs_edit_trade_limit.lua")
 | |
| 	-- trade one item(stack) against one other item(stack)
 | |
| 	dofile(modpath .. "trade_simple.lua")
 | |
| 	-- just click on a button to buy items from the trade list
 | |
| 	dofile(modpath .. "fs_trade_via_buy_button.lua")
 | |
| 	-- easily accessible list of all trades the NPC offers
 | |
| 	dofile(modpath .. "fs_trade_list.lua")
 | |
| 	-- as the name says: list which npc acesses a variable how and in which context
 | |
| 	dofile(modpath .. "fs_get_list_of_usage_of_variable.lua")
 | |
| 	-- show which values are stored for which player in a quest variable
 | |
| 	dofile(modpath .. "fs_show_all_var_values.lua")
 | |
| 	-- manage quest variables: add, delete, manage access rights etc.
 | |
| 	dofile(modpath .. "fs_manage_variables.lua")
 | |
| 	-- handle variables for quests for player-owned NPC
 | |
| 	dofile(modpath .. "quest_api.lua")
 | |
| 	-- GUI for adding/editing quests
 | |
| 	dofile(modpath .. "fs_manage_quests.lua")
 | |
| 	-- GUI for adding/editing quest steps for the quests
 | |
| 	dofile(modpath .. "fs_manage_quest_steps.lua")
 | |
| 	-- used by the above
 | |
| 	dofile(modpath .. "fs_add_quest_steps.lua")
 | |
| 	-- setting skin, wielded item etc.
 | |
| 	dofile(modpath .. "fs_fashion.lua")
 | |
| 	-- properties for NPC without specific dialogs that want to make use of
 | |
| 	-- some generic dialogs
 | |
| 	dofile(modpath .. "fs_properties.lua")
 | |
| 	-- the main functionality of the mod
 | |
| 	dofile(modpath .. "functions.lua")
 | |
| 	-- implementation of the chat commands registered in register_once.lua:
 | |
| 	dofile(modpath .. "chat_commands.lua")
 | |
| 	-- creating and maintaining quests
 | |
| 	dofile(modpath .. "fs_quest_gui.lua")
 | |
| 
 | |
| 	-- show a list of all NPC the player can edit
 | |
| 	dofile(modpath .. "fs_npc_list.lua")
 | |
| 
 | |
| 	-- some general functions that are useful for mobs_redo
 | |
| 	-- (react to right-click, nametag color etc.)
 | |
| 	-- only gets loaded if mobs_redo (mobs) exists as mod
 | |
| 	dofile(modpath .. "interface_mobs_api.lua")
 | |
| 
 | |
| 	-- initialize and load all registered generic dialogs
 | |
| 	yl_speak_up.load_generic_dialogs()
 | |
| 
 | |
| 	if(log_entry) then
 | |
| 		minetest.log("action","[MOD] yl_speak_up "..tostring(log_entry))
 | |
| 	end
 | |
| 
 | |
| 	-- reload all mods that may have to add something as well
 | |
| 	for i, f in ipairs(yl_speak_up.inform_when_reloaded) do
 | |
| 		f()
 | |
| 	end
 | |
| 
 | |
| 	-- Add functionality that exist only on your server.
 | |
| 	yl_speak_up_execute_if_file_exists("reload")
 | |
| end
 | |
| 
 | |
| 
 | |
| -- register all the necessary things; this ought to be done only once
 | |
| -- (although most might work without a server restart as well; but we
 | |
| -- better want to be on the safe side here)
 | |
| dofile(modpath .. "register_once.lua")
 | |
| 
 | |
| -- Register things that are only used on your server.
 | |
| yl_speak_up_execute_if_file_exists("startup")
 | |
| 
 | |
| 
 | |
| -- load all those files that can also be reloaded without a server restart
 | |
| -- load here for the first time:
 | |
| yl_speak_up.reload(modpath, "loaded")
 |