From ec7da27759c08e0741fe9151f056a8378c9a8aa1 Mon Sep 17 00:00:00 2001 From: Tom Barrett Date: Sun, 16 Aug 2020 13:35:42 +0200 Subject: some tes3mp scripts --- tes3mp/custom.diff | 59 ++++++++++++++++++++ tes3mp/disableAssassins.lua | 127 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 tes3mp/custom.diff create mode 100644 tes3mp/disableAssassins.lua diff --git a/tes3mp/custom.diff b/tes3mp/custom.diff new file mode 100644 index 0000000..6b8ba34 --- /dev/null +++ b/tes3mp/custom.diff @@ -0,0 +1,59 @@ +diff --git a/scripts/eventHandler.lua b/scripts/eventHandler.lua +index f30775c..8a49224 100644 +--- a/scripts/eventHandler.lua ++++ b/scripts/eventHandler.lua +@@ -302,6 +302,7 @@ eventHandler.OnPlayerLevel = function(pid) + if eventStatus.validDefaultHandler then + Players[pid]:SaveLevel() + Players[pid]:SaveStatsDynamic() ++ disableAssassins.OnLevelUp(pid) + end + customEventHooks.triggerHandlers("OnPlayerLevel", eventStatus, {pid}) + end +diff --git a/scripts/player/base.lua b/scripts/player/base.lua +index 36cdd3c..cc1e8ac 100644 +--- a/scripts/player/base.lua ++++ b/scripts/player/base.lua +@@ -202,6 +202,8 @@ function BasePlayer:FinishLogin() + self:LoadJournal() + end + ++ disableAssassins.OnLogin(self.pid) ++ + if config.shareFactionRanks == true then + WorldInstance:LoadFactionRanks(self.pid) + else +@@ -299,6 +301,8 @@ function BasePlayer:EndCharGen() + + WorldInstance:LoadKills(self.pid) + ++ disableAssassins.OnLogin(self.pid) ++ + if config.defaultSpawnCell ~= nil then + + tes3mp.SetCell(self.pid, config.defaultSpawnCell) +diff --git a/scripts/serverCore.lua b/scripts/serverCore.lua +index a4f7e0c..4c55a3b 100644 +--- a/scripts/serverCore.lua ++++ b/scripts/serverCore.lua +@@ -1,6 +1,8 @@ + require("utils") + require("enumerations") + ++disableAssassins = require("disableAssassins") ++ + jsonInterface = require("jsonInterface") + + -- Lua's default io library for input/output can't open Unicode filenames on Windows, +diff --git a/scripts/world/base.lua b/scripts/world/base.lua +index bc24e76..304b568 100644 +--- a/scripts/world/base.lua ++++ b/scripts/world/base.lua +@@ -292,6 +292,7 @@ function BaseWorld:SaveKills(pid) + for index = 0, tes3mp.GetKillChangesSize(pid) - 1 do + + local refId = tes3mp.GetKillRefId(pid, index) ++ disableAssassins.OnKill(pid, refId) + local number = tes3mp.GetKillNumber(pid, index) + self.data.kills[refId] = number + end diff --git a/tes3mp/disableAssassins.lua b/tes3mp/disableAssassins.lua new file mode 100644 index 0000000..ae72a51 --- /dev/null +++ b/tes3mp/disableAssassins.lua @@ -0,0 +1,127 @@ +local Methods = {} +--[[Setting defines how the assassins disbaled +1: script checks if the journal entries associated with the quest are present and if not - adds them to the journal to completely +skip having assassins. +2: track how many assassins the player kills and store it in a custom variable. Load the value on login. +3: set assassin spawn occurance to initialKills, which is by default max-1, so players would only see the assassins spawn once. +4: set the appropriate script value to 10 and disable assassins from spawning if player's level is below minLevel value. +Set the value to initialKills instead if above the level requirement. +]] +local setting = 1 +-- Minimum level to start having assassins appear if setting == 4 +local minLevel = 20 +--[[Initial occurance value to use. Only applicable when setting is 3 or 4. The higher the value, the smaller the odds. Odds are 0 +at 10, 1% at 9, 11% at 8 and so on. Odds are also affected by player's level - low level will have odds of 0 with values +of 3 and up, for example. In a way, it can be used to delay assassin spawn before certain level is reached, although a separate +setting does it better.]] +local initialKills = 0 + +-- Check how to handle the script based on setting when player joins the game +Methods.OnLogin = function(pid) + local data = disableAssassins.DefineData(pid) + local level = Players[pid].data.stats.level + if setting == 1 then + disableAssassins.CheckJournal(pid) + elseif setting == 2 then + disableAssassins.LoadKills(pid, data) + elseif setting == 3 then + if data.disableAssassins < initialKills then + data.disableAssassins = initialKills + end + disableAssassins.LoadKills(pid, data) + elseif setting == 4 then + if level < minLevel then + -- set it to something very unlikely to occur naturally and disable spawning + data.disableAssassins = 999 + end + disableAssassins.LoadKills(pid, data) + end +end + +-- Find customVariables based on journal sharing setting, define saved variable +Methods.DefineData = function(pid) + local data + if config.shareJournal then + data = WorldInstance.data.customVariables + else + data = Players[pid].data.customVariables + end + if data.Skvysh == nil then + data.Skvysh = {} + end + if data.Skvysh.disableAssassins == nil then + data.Skvysh.disableAssassins = 0 + end + return data.Skvysh +end + +-- Check if the target killed was an assassin and count it as an occurance for later sessions +Methods.OnKill = function(pid, refId) + local assassins = {"db_assassin1b", "db_assassin1", "db_assassin2", "db_assassin3", "db_assassin4"} + local isAssassin = false + local data = disableAssassins.DefineData(pid) + if tableHelper.containsValue(assassins, refId, false) then + isAssassin = true + end + if isAssassin then + data.disableAssassins = data.disableAssassins + 1 + end +end + +-- Check if journal already has the quest done and ask to add the entries if not +Methods.CheckJournal = function(pid) + local journal + local found = false + if config.shareJournal then + journal = WorldInstance.data.journal + else + journal = Players[pid].data.journal + end + for key, value in pairs(journal) do + if journal[key].quest == "tr_dbattack" then + if journal[key].index == 60 then + found = true + end + end + end + if found == false then + disableAssassins.AddJournal(pid) + disableAssassins.AddTopic(pid) + end +end + +-- Add journal entries to end the attacks and allow teleportation to Mournhold +Methods.AddJournal = function(pid) + logicHandler.RunConsoleCommandOnPlayer(pid, "Journal TR_DBAttack 10") + logicHandler.RunConsoleCommandOnPlayer(pid, "Journal TR_DBAttack 30") + logicHandler.RunConsoleCommandOnPlayer(pid, "Journal TR_DBAttack 40") + logicHandler.RunConsoleCommandOnPlayer(pid, "Journal TR_DBAttack 50") + logicHandler.RunConsoleCommandOnPlayer(pid, "Journal TR_DBAttack 60") +end + +-- add topics regarding the quest +Methods.AddTopic = function(pid) + logicHandler.RunConsoleCommandOnPlayer(pid, "AddTopic \"Dark Brotherhood\"") + logicHandler.RunConsoleCommandOnPlayer(pid, "AddTopic \"transport to Mournhold\"") + logicHandler.RunConsoleCommandOnPlayer(pid, "AddTopic \"transport to Vvardenfell\"") +end + +-- Set occurance value through console based on stored value +Methods.LoadKills = function(pid, data) + logicHandler.RunConsoleCommandOnPlayer(pid, "Set dbAttackScript.attackonce to " .. data.disableAssassins) +end + +-- When a player levels up, check if they passed the threshold and set occurance count to initialKills if that is the case +Methods.OnLevelUp = function(pid) + local data = disableAssassins.DefineData(pid) + local level = Players[pid].data.stats.level + if level >= minLevel then + -- if it was disabled before through the script + if data.disableAssassins >= 999 then + data.disableAssassins = initialKills + disableAssassins.LoadKills(pid, data) + end + end +end + +return Methods -- cgit v1.2.3