Guest User

Untitled

a guest
Jan 13th, 2021
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.70 KB | None | 0 0
  1. {\rtf1\ansi\deff0\nouicompat{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
  2. {\*\generator Riched20 10.0.18362}\viewkind4\uc1
  3. \pard\sa200\sl276\slmult1\f0\fs22\lang9 -- kanaBank - Release 3 - For tes3mp 0.7-alpha\par
  4. -- Implements a banking system for players to utilise\par
  5. \par
  6. --[[ INSTALLATION\par
  7. = GENERAL =\par
  8. a) Save this file as "kanaBank.lua" in server/scripts/custom\par
  9. \par
  10. = IN customScripts.LUA =\par
  11. a) kanaBank = require("custom.kanaBank")\par
  12. ]]\par
  13. \par
  14. local scriptConfig = \{\}\par
  15. \par
  16. scriptConfig.useBankerRank = 0 -- The staffRank required to use a bank via bankers\par
  17. scriptConfig.useBankCommandRank = 0 -- The staffRank required to use the /bank command\par
  18. scriptConfig.openOtherPlayersBankRank = 1 -- The staffRank required to use the /bank playername command\par
  19. \par
  20. -- Any object that's identified as a "banker" will open a player's bank on activation\par
  21. -- Provided the player meets the useBankerRank requirement. This /should/ override the default activation\par
  22. scriptConfig.bankerRefIds = \{"m'aiq",\}\par
  23. scriptConfig.bankerUniqueIndexes = \{\}\par
  24. \par
  25. -- Setting the following to true will have the script block any attempts at deleting a banker/bank storage item respectively\par
  26. -- Note that having them false doesn't guarantee attempts will always be successful - other things might also block its deletion.\par
  27. scriptConfig.denyBankerDelete = true\par
  28. scriptConfig.denyBankStorageDelete = true\par
  29. \par
  30. scriptConfig.baseObjectRefId = "dead rat"\par
  31. scriptConfig.baseObjectRecordType = "creature"\par
  32. scriptConfig.storageCell = "Clutter Warehouse - Everything Must Go!" -- The cell that will contain all the player's bank containers. Use a cell that can't be visited (like a debug cell). If running a cell resetting script, ensure the provided cell is exempt from resetting (if using Atkana's CellReset, this'll automatically be registered)!\par
  33. \par
  34. scriptConfig.logging = true\par
  35. scriptConfig.debug = false\par
  36. \par
  37. scriptConfig.recordRefId = "kanabankcontainer" -- Used internally for this script's base permanent record id. There should be no reason you'd need to change it\par
  38. \par
  39. local lang = \{\par
  40. \tab ["openOtherPlayerBankFailNoRank"] = "You don't have the required staff rank to open other player's banks.",\par
  41. \tab ["openOtherPlayerBankFailNoPlayer"] = "Couldn't find a bank for the player %name.",\par
  42. \tab ["useBankCommandFailNoRank"] = "You don't have the required staff rank to use the /bank command.",\par
  43. \tab ["useBankerFailNoRank"] = "You don't have the required staff rank to use bankers.",\par
  44. \tab\par
  45. \tab ["baseBankContainerDisplayName"] = "Bank Storage",\par
  46. \tab ["yourStorageName" ] = "Your Bank Storage",\par
  47. \tab ["otherPlayerStorageName"] = "%name's Bank Storage",\par
  48. \}\par
  49. \par
  50. ---------------------------------------------------------------------------------------\par
  51. \par
  52. local Methods = \{\}\par
  53. \par
  54. local scriptData = \{links = \{\}\}\par
  55. local scriptTemp = \{bankerRefIds = \{\}, bankerUniqueIndexes = \{\}\}\par
  56. \par
  57. Methods.GetLangText = function(key, data)\par
  58. \tab local function replacer(wildcard)\par
  59. \tab\tab if data[wildcard] then\par
  60. \tab\tab\tab return data[wildcard]\par
  61. \tab\tab else\par
  62. \tab\tab\tab return ""\par
  63. \tab\tab end\par
  64. \tab end\par
  65. \tab\par
  66. \tab local text = lang[key] or ""\par
  67. \tab text = text:gsub("%%(%w+)", replacer)\par
  68. \tab\par
  69. \tab return text\par
  70. end\par
  71. \par
  72. Methods.Save = function()\par
  73. \tab jsonInterface.save("custom/kanaBank.json", scriptData)\par
  74. end\par
  75. \par
  76. Methods.Load = function()\par
  77. \tab local loadedData = jsonInterface.load("custom/kanaBank.json")\par
  78. \tab\par
  79. \tab if loadedData then\par
  80. \tab\tab scriptData = loadedData\par
  81. \tab else\par
  82. \tab\tab -- There wasn't a json saved for this script, so we'll make one\par
  83. \tab\tab -- (We'll be using the default scriptData as is)\par
  84. \tab\tab Methods.Save()\par
  85. \tab end\par
  86. end\par
  87. \par
  88. local function doLog(message)\par
  89. \tab if scriptConfig.logging then\par
  90. \tab\tab tes3mp.LogMessage(1, "[kanaBank] - " .. message)\par
  91. \tab end\par
  92. end\par
  93. \par
  94. local function doDebug(message)\par
  95. \tab if scriptConfig.debug then\par
  96. \tab\tab tes3mp.LogMessage(1, "[kanaBank DEBUG] - " .. message)\par
  97. \tab end\par
  98. end\par
  99. \par
  100. ---------------------------------------------------------------------------------------\par
  101. local function getName(pid)\par
  102. \tab if Players[pid] ~= nil and Players[pid]:IsLoggedIn() then\par
  103. \tab\tab return Players[pid].accountName\par
  104. \tab end\par
  105. end\par
  106. \par
  107. -- Quick lazy function to message player so I don't have to type out the whole function + remember to add a newline to the end :P\par
  108. local function msg(pid, message)\par
  109. \tab tes3mp.SendMessage(pid, message .. "\\n")\par
  110. end\par
  111. \par
  112. -- Technically I could just always do logicHandler.LoadCell(scriptConfig.storageCell) and it'd accomplish the same thing...\par
  113. local function ensureCellLoaded()\par
  114. \tab if LoadedCells[scriptConfig.storageCell] == nil then\par
  115. \tab\tab logicHandler.LoadCell(scriptConfig.storageCell)\par
  116. \tab end\par
  117. end\par
  118. \par
  119. -- Temporarily changes the name of all instances of an object of the given refId for a player\par
  120. -- The refId to change need not be an actual custom record! Any refId works fine.\par
  121. -- Need to provide the recordType of the record\par
  122. Methods.RenameRecordForPid = function(pid, newName, refId, recordType)\par
  123. \tab tes3mp.ClearRecords()\par
  124. \tab tes3mp.SetRecordType(enumerations.recordType[string.upper(recordType)])\par
  125. \tab\par
  126. \tab packetBuilder.AddRecordByType(refId, \{baseId = refId, name = newName\}, recordType)\par
  127. \par
  128. \tab tes3mp.SendRecordDynamic(pid, false, false)\par
  129. end\par
  130. \par
  131. Methods.RegisterBankerRefId = function(refId)\par
  132. \tab scriptTemp.bankerRefIds[refId] = true\par
  133. \tab doDebug("Registered banker refId: " .. refId)\par
  134. end\par
  135. \par
  136. Methods.RegisterBankerUniqueIndex = function(uniqueIndex)\par
  137. \tab scriptTemp.bankerUniqueIndexes[uniqueIndex] = true\par
  138. \tab doDebug("Registered banker uniqueIndex: " .. uniqueIndex)\par
  139. end\par
  140. \par
  141. Methods.IsAllowedDeleteUniqueIndex = function(uniqueIndex)\par
  142. \tab -- Check to protect bankers if configured\par
  143. \tab if scriptConfig.denyBankerDelete then\par
  144. \tab\tab if Methods.IsBankerUniqueIndex(uniqueIndex) then\par
  145. \tab\tab\tab return false\par
  146. \tab\tab end\par
  147. \tab end\par
  148. \tab\par
  149. \tab -- Check to protect bank storage if configured\par
  150. \tab if scriptConfig.denyBankStorageDelete then\par
  151. \tab\tab if Methods.IsBankStorageUniqueIndex(uniqueIndex) then\par
  152. \tab\tab\tab return false\par
  153. \tab\tab end\par
  154. \tab end\par
  155. \tab\par
  156. \tab -- If we get here, we're fine\par
  157. \tab return true\par
  158. end\par
  159. \par
  160. Methods.IsAllowedDeleteRefId = function(refId)\par
  161. \tab -- Check to protect bankers if configured\par
  162. \tab if scriptConfig.denyBankerDelete then\par
  163. \tab\tab if Methods.IsBankerRefId(refId) then\par
  164. \tab\tab\tab return false\par
  165. \tab\tab end\par
  166. \tab end\par
  167. \tab\par
  168. \tab -- If we get here, we're fine\par
  169. \tab return true\par
  170. end\par
  171. \par
  172. -- Returns true if provided uniqueIndex belongs to a banker\par
  173. Methods.IsBankerUniqueIndex = function(uniqueIndex)\par
  174. \tab return scriptTemp.bankerUniqueIndexes[uniqueIndex] or false\par
  175. end\par
  176. \par
  177. -- Returns true if provided refId belongs to a banker\par
  178. Methods.IsBankerRefId = function(refId)\par
  179. \tab return scriptTemp.bankerRefIds[refId] or false\par
  180. end\par
  181. \par
  182. -- Returns true if provided uniqueIndex belongs to a player's bank storage\par
  183. Methods.IsBankStorageUniqueIndex = function(uniqueIndex)\par
  184. \tab for playerName, storageUniqueIndex in pairs(scriptData.links) do\par
  185. \tab\tab if storageUniqueIndex == uniqueIndex then\par
  186. \tab\tab\tab return true\par
  187. \tab\tab end\par
  188. \tab end\par
  189. \tab\par
  190. \tab -- If we get here, we haven't found anything, so it's not a bank storage for anyone\par
  191. \tab return false\par
  192. end\par
  193. \par
  194. Methods.GetPlayerContainerUniqueIndex = function(playerName)\par
  195. \tab return scriptData.links[string.lower(playerName)] or false\par
  196. end\par
  197. \par
  198. Methods.DoesPlayerHaveContainer = function(playerName)\par
  199. \tab local uniqueIndex = Methods.GetPlayerContainerUniqueIndex(playerName)\par
  200. \tab\par
  201. \tab if uniqueIndex then\par
  202. \tab\tab -- Check to make sure that the object still exists\par
  203. \tab\tab ensureCellLoaded()\par
  204. \tab\tab\par
  205. \tab\tab if LoadedCells[scriptConfig.storageCell]:ContainsObject(uniqueIndex) then\par
  206. \tab\tab\tab return true\par
  207. \tab\tab else\par
  208. \tab\tab\tab -- Somehow, the player's storage has been deleted.\par
  209. \tab\tab\tab -- We should remove the links\par
  210. \tab\tab\tab Methods.RemovePlayerContainerLink(playerName)\par
  211. \tab\tab\tab return false\par
  212. \tab\tab end\par
  213. \tab else --There's no recorded link for that player\par
  214. \tab\tab return false\tab\par
  215. \tab end\par
  216. end\par
  217. \par
  218. Methods.AddPlayerContainerLink = function(playerName, uniqueIndex)\par
  219. \tab scriptData.links[string.lower(playerName)] = uniqueIndex\par
  220. \tab Methods.Save()\par
  221. \tab\par
  222. \tab doDebug("Added new link to container " .. uniqueIndex .. " for " .. playerName)\par
  223. end\par
  224. \par
  225. Methods.RemovePlayerContainerLink = function(playerName)\par
  226. \tab scriptData.links[string.lower(playerName)] = nil\par
  227. \tab Methods.Save()\par
  228. \tab\par
  229. \tab doDebug("Removed existing link to container for " .. playerName)\par
  230. end\par
  231. \par
  232. Methods.CreateContainerForPlayer = function(playerName)\par
  233. \tab -- Make sure the cell is loaded\par
  234. \tab ensureCellLoaded()\par
  235. \tab\par
  236. \tab -- Spawn the object\par
  237. \tab -- Determine if "place" or "spawn" packet should be used\par
  238. \tab local packetType\par
  239. \tab if scriptConfig.baseObjectRecordType == "creature" or scriptConfig.baseObjectRecordType == "npc" then\par
  240. \tab\tab packetType = "spawn"\par
  241. \tab else\par
  242. \tab\tab packetType = "place"\par
  243. \tab end\par
  244. \tab\par
  245. \tab -- Just make a dummy location because we don't care about where it'll be\par
  246. \tab local location = \{posX = 0, posY = 0, posZ = 0, rotX = 0, rotY = 0, rotZ = 0\}\par
  247. \tab\par
  248. \tab local uniqueIndex = logicHandler.CreateObjectAtLocation(scriptConfig.storageCell, location, scriptConfig.recordRefId, packetType)\par
  249. \tab\par
  250. \tab doLog("Created a bank container with uniqueIndex " .. uniqueIndex .. " for player " .. playerName)\par
  251. \tab\par
  252. \tab -- Add container data\par
  253. \tab LoadedCells[scriptConfig.storageCell].data.objectData[uniqueIndex].inventory = \{\}\par
  254. \tab tableHelper.insertValueIfMissing(LoadedCells[scriptConfig.storageCell].data.packets.container, uniqueIndex)\par
  255. \tab\par
  256. \tab LoadedCells[scriptConfig.storageCell]:Save()\par
  257. \tab\par
  258. \tab -- Add a link in the script's data\par
  259. \tab Methods.AddPlayerContainerLink(playerName, uniqueIndex)\par
  260. \tab\par
  261. \tab return uniqueIndex\par
  262. end\par
  263. \par
  264. -- Use to load the data of all custom records contained in a provided inventory\par
  265. Methods.LoadInventoryGeneratedRecords = function(pid, inventory)\par
  266. \tab local storeTypes = \{\}\par
  267. \tab\par
  268. \tab for index, item in ipairs(inventory) do\par
  269. \tab\tab if logicHandler.IsGeneratedRecord(item.refId) then\par
  270. \tab\tab\tab local recordType = string.match(item.refId, "_(%a+)_")\par
  271. \tab\tab\tab\par
  272. \tab\tab\tab if not storeTypes[recordType] then storeTypes[recordType] = \{\} end\par
  273. \tab\tab\tab\par
  274. \tab\tab\tab table.insert(storeTypes[recordType], item.refId)\par
  275. \tab\tab end\par
  276. \tab end\par
  277. \tab\par
  278. \tab -- If there were items found, load them from each relevant store\par
  279. \tab if not tableHelper.isEmpty(storeTypes) then\par
  280. \tab\tab for storeType, refIdList in pairs(storeTypes) do\par
  281. \tab\tab\tab local recordStore = RecordStores[storeType]\par
  282. \par
  283. \tab\tab\tab if recordStore ~= nil then\par
  284. \tab\tab\tab\tab recordStore:LoadGeneratedRecords(pid, recordStore.data.generatedRecords, refIdList)\par
  285. \tab\tab\tab end\par
  286. \tab\tab end\par
  287. \tab end\par
  288. end\par
  289. \par
  290. Methods.OpenNamedPlayersContainerForPid = function(pid, targetPlayerName)\par
  291. \tab local playerName = getName(pid)\par
  292. \tab\par
  293. \tab if not Methods.DoesPlayerHaveContainer(targetPlayerName) then\par
  294. \tab\tab -- Target player doesn't have a container!\par
  295. \tab\tab return false\par
  296. \tab end\par
  297. \tab\par
  298. \tab local targetUniqueIndex = Methods.GetPlayerContainerUniqueIndex(targetPlayerName)\par
  299. \tab\par
  300. \tab -- Work out the relationships between players\par
  301. \tab if string.lower(playerName) == string.lower(targetPlayerName) then\par
  302. \tab\tab -- The player is opening their own container\par
  303. \tab\tab -- Rename the storage to reflect that it's theirs\par
  304. \tab\tab Methods.RenameRecordForPid(pid, Methods.GetLangText("yourStorageName"),scriptConfig.recordRefId, scriptConfig.baseObjectRecordType)\par
  305. \tab else\par
  306. \tab\tab -- The player is opening somebody else's container\par
  307. \tab\tab -- Rename the storage to reflect that it's someone else's\par
  308. \tab\tab Methods.RenameRecordForPid(pid, Methods.GetLangText("otherPlayerStorageName", \{name = targetPlayerName\}),scriptConfig.recordRefId, scriptConfig.baseObjectRecordType)\par
  309. \tab end\par
  310. \tab\par
  311. \tab -- Ensure cell is loaded\par
  312. \tab ensureCellLoaded()\par
  313. \tab\par
  314. \tab -- Ensure the player has the container's data loaded\par
  315. \tab local oData = LoadedCells[scriptConfig.storageCell].data.objectData\par
  316. \par
  317. \tab if scriptConfig.baseObjectRecordType == "creature" or scriptConfig.baseObjectRecordType == "npc" then\par
  318. \tab\tab LoadedCells[scriptConfig.storageCell]:LoadObjectsSpawned(pid, oData, \{targetUniqueIndex\})\par
  319. \tab else\par
  320. \tab\tab LoadedCells[scriptConfig.storageCell]:LoadObjectsPlaced(pid, oData, \{targetUniqueIndex\})\par
  321. \tab end\par
  322. \tab\par
  323. \tab -- Ensure player has all generated records associated with the inventory\par
  324. \tab Methods.LoadInventoryGeneratedRecords(pid, oData[targetUniqueIndex].inventory)\par
  325. \tab -- Load container info\par
  326. \tab LoadedCells[scriptConfig.storageCell]:LoadContainers(pid, oData, \{targetUniqueIndex\})\par
  327. \tab\par
  328. \tab -- Activate the container to open up its contents!\par
  329. \tab logicHandler.ActivateObjectForPlayer(pid, scriptConfig.storageCell, targetUniqueIndex)\par
  330. \tab\par
  331. \tab doLog(playerName .. " opened the bank container of " .. targetPlayerName .. ".")\par
  332. end\par
  333. \par
  334. ---------------------------------------------------------------------------------------\par
  335. Methods.OnBankCommand = function(pid, cmd)\par
  336. \tab local playerRank = Players[pid].data.settings.staffRank\par
  337. \tab\par
  338. \tab if not cmd[2] then -- Regular bank command was used\par
  339. \tab\tab if playerRank >= scriptConfig.useBankCommandRank then\par
  340. \tab\tab\tab local playerName = getName(pid)\par
  341. \tab\tab\tab\par
  342. \tab\tab\tab -- Check whether or not the player has a container\par
  343. \tab\tab\tab if not Methods.DoesPlayerHaveContainer(playerName) then\par
  344. \tab\tab\tab\tab -- Since they don't, create one!\par
  345. \tab\tab\tab\tab Methods.CreateContainerForPlayer(playerName)\par
  346. \tab\tab\tab end\par
  347. \tab\tab\tab\par
  348. \tab\tab\tab -- Open the player's container for them\par
  349. \tab\tab\tab Methods.OpenNamedPlayersContainerForPid(pid, playerName)\par
  350. \tab\tab\tab return true\par
  351. \tab\tab else -- Player doesn't have the rank to use the command\par
  352. \tab\tab\tab msg(pid, Methods.GetLangText("useBankCommandFailNoRank"))\par
  353. \tab\tab\tab return false\par
  354. \tab\tab end\par
  355. \tab else -- The player provided more data (i.e. the playername of the bank they want to open)\par
  356. \tab\tab -- Do rank check before continuing\par
  357. \tab\tab if playerRank >= scriptConfig.openOtherPlayersBankRank then\par
  358. \tab\tab\tab local targetPlayerName\par
  359. \tab\tab\tab local givenName = tableHelper.concatenateFromIndex(cmd, 2)\par
  360. \tab\tab\tab\par
  361. \tab\tab\tab if tonumber(givenName) then -- Might've entered a pid\par
  362. \tab\tab\tab\tab if Players[pid] ~= nil then\par
  363. \tab\tab\tab\tab\tab targetPlayerName = getName(pid)\par
  364. \tab\tab\tab\tab else\par
  365. \tab\tab\tab\tab\tab -- Use the number as a name...\par
  366. \tab\tab\tab\tab\tab targetPlayerName = givenName\par
  367. \tab\tab\tab\tab end\par
  368. \tab\tab\tab else\par
  369. \tab\tab\tab\tab targetPlayerName = givenName\par
  370. \tab\tab\tab end\par
  371. \tab\tab\tab\par
  372. \tab\tab\tab -- Check if there's actually data for that player's bank\par
  373. \tab\tab\tab if not Methods.DoesPlayerHaveContainer(targetPlayerName) then\par
  374. \tab\tab\tab\tab msg(pid, Methods.GetLangText("openOtherPlayerBankFailNoPlayer", \{name = targetPlayerName\}))\par
  375. \tab\tab\tab\tab return false\par
  376. \tab\tab\tab end\par
  377. \tab\tab\tab\par
  378. \tab\tab\tab -- Open the bank container for them\par
  379. \tab\tab\tab Methods.OpenNamedPlayersContainerForPid(pid, targetPlayerName)\par
  380. \tab\tab\tab return true\par
  381. \tab\tab else -- Player doesn't have the required rank\par
  382. \tab\tab\tab msg(pid, Methods.GetLangText("openOtherPlayerBankFailNoRank"))\par
  383. \tab\tab\tab return false\par
  384. \tab\tab end\par
  385. \tab end\par
  386. end\par
  387. \par
  388. -- Validator for activations. Used to prevent default behaviour for players activating bankers.\par
  389. Methods.ActivationCheck = function(eventStatus, pid, cellDescription, objects, players)\par
  390. \tab for _,object in pairs(objects) do\par
  391. \tab\tab -- Only bothered about the activation if:\par
  392. \tab\tab -- > The object is an object (not a player)\par
  393. \tab\tab -- > A player is the one doing the activation\par
  394. \tab\tab if object.pid == nil and object.activatingPid ~= nil then\par
  395. \tab\tab\tab local refId = object.refid\par
  396. \tab\tab\tab local uniqueIndex = object.uniqueIndex\par
  397. \par
  398. \tab\tab\tab -- Check whether or not this is a banker\par
  399. \tab\tab\tab if Methods.IsBankerUniqueIndex(uniqueIndex) or Methods.IsBankerRefId(refId) then\par
  400. \tab\tab\tab\tab -- Prevent the activation of the banker object, regardless of whether or not the player can actually use the banker\par
  401. \tab\tab\tab\tab return customEventHooks.makeEventStatus(false, nil)\par
  402. \tab\tab\tab end\par
  403. \tab\tab end\par
  404. \tab\tab -- Was either not a banker, or not a player doing the activation. Either way, we don't care about it.\par
  405. \tab\tab return customEventHooks.makeEventStatus(nil,nil)\par
  406. \tab end\par
  407. end\par
  408. \par
  409. Methods.OnObjectActivate = function(eventStatus, pid, cellDescription, objects, players)\par
  410. if eventStatus.validCustomHandlers ~= false then\par
  411. for _,object in pairs(objects) do\par
  412. if object.pid == nil and object.activatingPid ~= nil then\par
  413. \tab\tab\tab\tab local refId = object.refId\par
  414. \tab\tab\tab\tab local uniqueIndex = object.uniqueIndex\par
  415. \tab\tab\tab\tab local pid = object.activatingPid\par
  416. \tab\tab\tab\tab\par
  417. \tab\tab\tab\tab local playerRank = Players[pid].data.settings.staffRank\par
  418. \tab\tab\tab\tab local playerName = getName(pid)\par
  419. \par
  420. \tab\tab\tab\tab if Methods.IsBankerUniqueIndex(uniqueIndex) or Methods.IsBankerRefId(refId) then\par
  421. \tab\tab\tab\tab\tab if not (playerRank >= scriptConfig.useBankerRank) then\par
  422. \tab\tab\tab\tab\tab\tab -- The player doesn't have the required rank to use bankers\par
  423. \tab\tab\tab\tab\tab\tab doLog(playerName .. " activated a banker, but doesn't have a sufficient rank to use it.")\par
  424. \tab\tab\tab\tab\tab\tab msg(pid, Methods.GetLangText("useBankerFailNoRank"))\par
  425. \tab\tab\tab\tab\tab else\par
  426. \tab\tab\tab\tab\tab\tab doLog(playerName .. " activated a banker, accessed their bank.")\par
  427. \tab\tab\tab\tab\tab\tab -- The player can use bankers\par
  428. \tab\tab\tab\tab\tab\tab -- Check whether or not the player has a container\par
  429. \tab\tab\tab\tab\tab\tab if not Methods.DoesPlayerHaveContainer(playerName) then\par
  430. \tab\tab\tab\tab\tab\tab\tab -- Since they don't, create one!\par
  431. \tab\tab\tab\tab\tab\tab\tab Methods.CreateContainerForPlayer(playerName)\par
  432. \tab\tab\tab\tab\tab\tab end\par
  433. \par
  434. \tab\tab\tab\tab\tab\tab -- Open the player's container for them\par
  435. \tab\tab\tab\tab\tab\tab Methods.OpenNamedPlayersContainerForPid(pid, playerName)\par
  436. \tab\tab\tab\tab\tab\tab doLog(playerName .. " opened their bank via the banker " .. refId .. " " .. uniqueIndex .. ".")\par
  437. \tab\tab\tab\tab\tab end\par
  438. \tab\tab\tab\tab end\par
  439. \tab\tab\tab end\par
  440. end\par
  441. end\par
  442. end\par
  443. \par
  444. -- Returning true signals we want to block deletion\par
  445. Methods.DeletionCheck = function(eventStatus, pid, cellDescription, objects)\par
  446. \tab for _,object in pairs(objects) do\par
  447. local refId = object.refId\par
  448. local uniqueIndex = object.uniqueIndex\par
  449. \par
  450. if not Methods.IsAllowedDeleteRefId(refId) or not Methods.IsAllowedDeleteUniqueIndex(uniqueIndex) then\par
  451. -- The object is protected by this script!\par
  452. doDebug("Prevented deletion of object " .. refId .. " " .. uniqueIndex)\par
  453. return customEventHooks.makeEventStatus(false,false)\par
  454. end\par
  455. end\par
  456. \par
  457. return customEventHooks.makeEventStatus(nil,nil)\par
  458. end\par
  459. \par
  460. Methods.OnServerPostInit = function(eventStatus)\par
  461. \tab -- Load data\par
  462. \tab Methods.Load()\par
  463. \tab\par
  464. \tab -- Detect if this script's permanent record has been created on this server yet\par
  465. \tab -- If it hasn't, create it\par
  466. \tab if RecordStores[scriptConfig.baseObjectRecordType].data.permanentRecords[scriptConfig.recordRefId] == nil then\par
  467. \tab\tab local data = \{baseId = "dead rat", name = Methods.GetLangText("baseBankContainerDisplayName")\}\par
  468. \tab\tab\par
  469. \tab\tab RecordStores[scriptConfig.baseObjectRecordType].data.permanentRecords[scriptConfig.recordRefId] = data\par
  470. \tab\tab\par
  471. \tab\tab RecordStores[scriptConfig.baseObjectRecordType]:Save()\par
  472. \tab\tab doLog("Created permanent record entry for the script's base object.")\par
  473. \tab end\par
  474. \tab\par
  475. \tab -- Port the banker info from the config into scriptTemp\par
  476. \tab local bankerRefs = 0\par
  477. \tab local bankerIndexes = 0\par
  478. \tab\par
  479. \tab for index, refId in ipairs(scriptConfig.bankerRefIds) do\par
  480. \tab\tab scriptTemp.bankerRefIds[refId] = true\par
  481. \tab\tab bankerRefs = bankerRefs + 1\par
  482. \tab end\par
  483. \tab\par
  484. \tab for index, uniqueIndex in ipairs(scriptConfig.bankerUniqueIndexes) do\par
  485. \tab\tab scriptTemp.bankerUniqueIndexes[uniqueIndex] = true\par
  486. \tab\tab bankerIndexes = bankerIndexes + 1\par
  487. \tab end\par
  488. \tab\par
  489. \tab if bankerRefs > 0 then\par
  490. \tab\tab doLog("Imported " .. bankerRefs .. " banker refIds from scriptConfig.")\par
  491. \tab end\par
  492. \tab\par
  493. \tab if bankerIndexes > 0 then\par
  494. \tab\tab doLog("Imported " .. bankerIndexes .. " banker uniqueIndexes from scriptConfig.")\par
  495. \tab end\par
  496. \tab\par
  497. \tab -- If CellReset is being used, register the storage cell as an exempt cell\par
  498. \tab if CellReset then\par
  499. \tab\tab CellReset.RegisterFullyExemptCell(scriptConfig.storageCell, "kanaBank")\par
  500. \tab\tab doLog("Ensured storage cell is exempt from CellReset resets.")\par
  501. \tab end\par
  502. end\par
  503. \par
  504. customEventHooks.registerValidator("OnObjectActivate",Methods.ActivationCheck)\par
  505. customEventHooks.registerValidator("OnObjectDelete",Methods.DeletionCheck)\par
  506. customEventHooks.registerHandler("OnServerPostInit",Methods.OnServerPostInit)\par
  507. customEventHooks.registerHandler("OnObjectActivate",Methods.OnObjectActivate)\par
  508. customCommandHooks.registerCommand("bank",Methods.OnBankCommand)\par
  509. -------------\par
  510. return Methods\par
  511. }
  512.  
Advertisement
Add Comment
Please, Sign In to add comment