123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- Dialog = { }
- -- defines for the requirement types
- REQ_RACE = 1
- REQ_CLASS = 2
- REQ_LEVEL = 3
- REQ_LEVEL_GREATER_OR_EQUAL = 4
- REQ_LEVEL_LESS_OR_EQUAL = 5
- REQ_QUEST_ELIGIBLE = 6
- REQ_QUEST_ON_STEP = 7
- REQ_QUEST_BEFORE_STEP = 8
- REQ_QUEST_PAST_STEP = 9
- REQ_QUEST_HAS_QUEST = 10
- REQ_QUEST_DOESNT_HAVE_QUEST = 11
- REQ_QUEST_NOT_ON_STEP = 12
- REQ_QUEST_HAS_COMPLETED_QUEST = 13
- REQ_QUEST_NOT_HAS_COMPLETED_QUEST = 14
- REQ_TEMP_VAR_NOT_SET = 15
- REQ_TEMP_VAR_SET = 16
- REQ_LUA_HISTORY_SET = 17
- REQ_LUA_HISTORY_NOT_SET = 18
- REQ_LOCATION_ID = 19
- REQ_TSLEVEL = 20
- REQ_TSLEVEL_GREATER_OR_EQUAL = 21
- REQ_TSLEVEL_LESS_OR_EQUAL = 22
- -- Dialog variables
- Dialog.NPC = nil
- Dialog.Player = nil
- Dialog.Dialog = {}
- -- private functions go at the top
- -- Checks the requirement table and returns false if the player failed a check or true if they pass ALL checks
- local function CheckRequirements(reqs)
- local ret = true
-
- -- if no requirements then return true
- if reqs ~= nil then
- -- loop through the requirements and check to see if the player fails them, if so set the return value
- -- to false and break the loop as we don't need to check any of the other requirements
- for k, v in pairs(reqs) do
- if v.Type == REQ_RACE and GetRace(Dialog.Player) ~= v.Value1 then
- ret = false
- break
- elseif v.Type == REQ_CLASS and GetClass(Dialog.Player) ~= v.Value1 then
- ret = false
- break
- elseif v.Type == REQ_LEVEL and GetLevel(Dialog.Player) ~= v.Value1 then
- ret = false
- break
- elseif v.Type == REQ_LEVEL_GREATER_OR_EQUAL and GetLevel(Dialog.Player) < v.Value1 then
- ret = false
- break
- elseif v.Type == REQ_LEVEL_LESS_OR_EQUAL and GetLevel(Dialog.Player) > v.Value1 then
- ret = false
- break
- elseif v.Type == REQ_QUEST_ELIGIBLE and not CanReceiveQuest(Dialog.Player, v.Value1) then
- ret = false
- break
- elseif v.Type == REQ_QUEST_ON_STEP and GetQuestStep(Dialog.Player, v.Value1) ~= v.Value2 then
- ret = false
- break
- elseif v.Type == REQ_QUEST_BEFORE_STEP and GetQuestStep(Dialog.Player, v.Value1) >= v.Value2 then
- ret = false
- break
- elseif v.Type == REQ_QUEST_PAST_STEP and GetQuestStep(Dialog.Player, v.Value1) <= v.Value2 then
- ret = false
- break
- elseif v.Type == REQ_QUEST_HAS_QUEST and not HasQuest(Dialog.Player, v.Value1) then
- ret = false
- break
- elseif v.Type == REQ_QUEST_DOESNT_HAVE_QUEST and HasQuest(Dialog.Player, v.Value1) then
- ret = false
- break
- elseif v.Type == REQ_QUEST_NOT_ON_STEP and GetQuestStep(Dialog.Player, v.Value1) == v.Value2 then
- ret = false
- break
- elseif v.Type == REQ_QUEST_HAS_COMPLETED_QUEST and not HasCompletedQuest(Dialog.Player, v.Value1) then
- ret = false
- break
- elseif v.Type == REQ_QUEST_NOT_HAS_COMPLETED_QUEST and HasCompletedQuest(Dialog.Player, v.Value1) then
- ret = false
- break
- elseif v.Type == REQ_TEMP_VAR_NOT_SET and GetTempVariable(Dialog.Player, v.Value1) == v.Value2 then
- ret = false
- break
- elseif v.Type == REQ_TEMP_VAR_SET and GetTempVariable(Dialog.Player, v.Value1) ~= v.Value2 then
- ret = false
- break
- elseif v.Type == REQ_LUA_HISTORY_SET then
- local value1, value2 = GetPlayerHistory(Dialog.Player, v.Value1)
- if v.Value2 ~= value1 then
- ret = false
- break
- elseif v.Value3 ~= nil and v.Value3 ~= value2 then
- ret = false
- break
- end
- elseif v.Type == REQ_LUA_HISTORY_NOT_SET then
- local value1, value2 = GetPlayerHistory(Dialog.Player, v.Value1)
- if v.Value2 == value1 then
- ret = false
- break
- elseif v.Value3 ~= nil and v.Value3 == value2 then
- ret = false
- break
- end
- elseif v.Type == REQ_LOCATION_ID and GetSpawnLocationID(Dialog.NPC) ~= v.Value1 then
- ret = false
- break
- elseif v.Type == REQ_TSLEVEL and GetTradeskillLevel(Dialog.Player) ~= v.Value1 then
- ret = false
- break
- elseif v.Type == REQ_TSLEVEL_GREATER_OR_EQUAL and GetTradeskillLevel(Dialog.Player) < v.Value1 then
- ret = false
- break
- elseif v.Type == REQ_TSLEVEL_LESS_OR_EQUAL and GetTradeskillLevel(Dialog.Player) > v.Value1 then
- ret = false
- break
- end
- end
- end
-
- return ret
- end
- -- Helper function to check requirements on options and actually use the option
- local function PrintOptions(dlg, con)
- -- loop through the options and check their requirements, if they pass add the option
- for k, v in pairs(dlg.Options) do
- if CheckRequirements(v.Requirements) == true then
- AddConversationOption(con, v.option, v.callback)
- ret=true
- end
- end
- return ret
- end
- -- Actual member functions are below, these are what you call in the other scripts
- -- Set up the spawn pointers to use
- function Dialog.New(NPC, Player)
- Dialog.NPC = NPC
- Dialog.Player = Player
- end
- -- Test function, left it in for now as it may be useful but it is just a Say()
- function Dialog.Test(Msg)
- if Dialog.NPC ~= nil then
- Say(Dialog.NPC, Msg)
- end
- end
- -- Add a dialog
- function Dialog.AddDialog(text)
- local dlg = {}
- dlg.Text = text
- dlg.Options = {}
- dlg.Requirements = nil
- dlg.VOFile = nil
- dlg.VOKey1 = nil
- dlg.VOKey2 = nil
- dlg.Emote = nil
- table.insert(Dialog.Dialog, dlg)
- end
- -- Adds requirements to the last added dialog
- function Dialog.AddRequirement(req_type, value1, value2, value3)
- local dlg = Dialog.Dialog[#Dialog.Dialog]
- if dlg.Requirements == nil then
- dlg.Requirements = {}
- end
- local req = {}
- req.Type = req_type
- req.Value1 = value1
- req.Value2 = value2
- req.Value3 = value3
- table.insert(dlg.Requirements, req)
- end
- -- Adds a voiceover to the last added dialog
- function Dialog.AddVoiceover(file, key1, key2)
- local dlg = Dialog.Dialog[#Dialog.Dialog]
- dlg.VOFile = file
- dlg.VOKey1 = key1
- dlg.VOKey2 = key2
- end
- -- Adds an emote to the last added dialog
- function Dialog.AddEmote(emote)
- local dlg = Dialog.Dialog[#Dialog.Dialog]
- dlg.Emote = emote
- end
- -- Adds options to the last added dialog
- function Dialog.AddOption(opt, cb)
- local dlg = Dialog.Dialog[#Dialog.Dialog]
- local option = {}
- option.option = opt
- option.callback = cb
- option.Requirements = nil
- table.insert(dlg.Options, option)
- end
- -- Adds requirements to the last added option
- function Dialog.AddOptionRequirement(req_type, value1, value2, value3)
- local dlg = Dialog.Dialog[#Dialog.Dialog]
- local option = dlg.Options[#dlg.Options]
- if option.Requirements == nil then
- option.Requirements = {}
- end
- local req = {}
- req.Type = req_type
- req.Value1 = value1
- req.Value2 = value2
- req.Value3 = value3
- table.insert(option.Requirements, req)
- end
- -- Actually sends the dialog to the player
- function Dialog.Start()
- -- if NPC or Player are nil then return out so we don't cause a null pointer error on the server
- if Dialog.NPC == nil or Dialog.Player == nil then
- -- would be great to print a lua error here
- return
- end
-
- -- create the conversation
- local con = CreateConversation()
-
- -- bool to see if we found a dialog to send
- local found = false
-
- -- loop through all the dialogs
- for key, dlg in pairs(Dialog.Dialog) do
- -- Check the dialog requirements if there are any and set the found bool
- if dlg.Requirements ~= nil then
- found = CheckRequirements(dlg.Requirements)
- else
- -- no requirements for this dialog so lets use it
- found = true
- end
-
- -- if we found a dialog to use lets set up the options for it and send it
- if found == true then
- HadOptions = PrintOptions(dlg, con)
- Say(Dialog.NPC,"found true")
- if dlg.Emote ~= nil then
- Say(Dialog.NPC,"Emote true")
- if HadOptions == true then
- StartConversation(con, Dialog.NPC, Dialog.Player, dlg.Text)
- else
- Say(Dialog.NPC,dlg.Text)
- end
- if dlg.VOFile ~= nil then
- Say(Dialog.NPC,"emote true VO true ")
- PlayFlavor(Dialog.NPC, dlg.VOFile, "", dlg.Emote, dlg.VOKey1, dlg.VOKey2, Dialog.Player)
- else
- Say(Dialog.NPC,"emote true VO false ")
- PlayFlavor(Dialog.NPC, "", "", dlg.Emote, 0, 0, Dialog.Player)
- end
- if HadOptions == true then
- StartConversation(con, Dialog.NPC, Dialog.Player, dlg.Text)
- else
- Say(Dialog.NPC,dlg.Text)
- end
- else
-
- if dlg.VOFile ~= nil then
- if HadOptions == true then
- StartConversation(con, Dialog.NPC, Dialog.Player, dlg.Text, dlg.VOFile, dlg.VOKey1, dlg.VOKey2)
- else
- PlayFlavor(Dialog.NPC, dlg.VOFile, dlg.Text, "", dlg.VOKey1, dlg.VOKey2, Dialog.Player)
- end
- else
- if HadOptions == true then
- StartConversation(con, Dialog.NPC, Dialog.Player, dlg.Text)
- else
- Say(Dialog.NPC,dlg.Text)
- end
- end
-
- end
-
- -- we sent a dialog so get out of the loop
- break;
- end
- end
-
- -- clear the list to avoid duplicates
- Dialog.Dialog = {}
- end
- return Dialog
|