-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.lua
339 lines (283 loc) · 10.7 KB
/
main.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
local Start = {}
Start.scriptName = "OriginalStart"
Start.defaultConfig = {
START_ON_DOCK = false,
CLEAN_ON_UNLOAD = true,
CHANGE_CONFIG_SPAWN = true
}
Start.defaultData = {
chargenPlayers = {}
}
Start.config = DataManager.loadConfiguration(Start.scriptName, Start.defaultConfig)
Start.data = DataManager.loadData(Start.scriptName, Start.defaultData)
Start.EXIT_DOOR = "119659-0"
Start.CHARGEN_CELLS = {
["Imperial Prison Ship"] = true,
["-2, -9"] = true,
["Seyda Neen, Census and Excise Office"] = true
}
Start.OFFICE = "Seyda Neen, Census and Excise Office"
Start.OFFICE_DOORS = {
["ex_nord_door_01"] = "119513-0",
["chargen_door_hall"] = "172860-0"
}
Start.deliveredCaiusPackage = nil
--enable the census office
contentFixer.ValidateCellChange = function(pid)
return true
end
--disable the standard way of disabling chargen elements, to allow to enable ergala and chargen boat
contentFixer.FixCell = function(pid)
return
end
local spawnLocation = nil
if not Start.config.START_ON_DOCK then
spawnLocation = {
cell = "Imperial Prison Ship",
regionName = "bitter coast region",
posX = 61,
posY = -136.5,
posZ = -104.25,
rotX = 0,
rotZ = -0.5
}
else
spawnLocation = {
cell = "-2, -9",
regionName = "bitter coast region",
posX = -8861.18,
posY = -73120.13,
posZ = 92.26,
rotX = 0,
rotZ = -0.97
}
end
if Start.config.CHANGE_CONFIG_SPAWN then
config.defaultSpawnCell = spawnLocation.cell
config.defaultSpawnPos = {
spawnLocation.posX,
spawnLocation.posY,
spawnLocation.posZ
}
config.defaultSpawnRot = {
spawnLocation.rotX,
spawnLocation.rotZ
}
end
function Start.getPlayerName(pid)
return string.lower(Players[pid].accountName)
end
function Start.isPlayerChargen(pid)
return Start.data.chargenPlayers[Start.getPlayerName(pid)] ~= nil
end
function Start.teleportToSpawn(pid)
local player = Players[pid]
player.data.location = spawnLocation
player:Save()
tes3mp.SetCell(pid, spawnLocation.cell)
tes3mp.SetRot(
pid,
spawnLocation.rotX,
spawnLocation.rotZ
)
tes3mp.SetPos(
pid,
spawnLocation.posX,
spawnLocation.posY,
spawnLocation.posZ
)
tes3mp.SendCell(pid)
tes3mp.SendPos(pid)
end
function Start.AddItem(pid, refId)
local player = Players[pid]
local item = {
refId = refId,
count = 1,
charge = -1,
enchantmentCharge = -1,
soul = ""
}
player:LoadItemChanges({item}, enumerations.inventory.ADD)
end
local runConsole = logicHandler.RunConsoleCommandOnPlayer
function Start.fixCharGen(pid)
Start.data.chargenPlayers[Start.getPlayerName(pid)] = true
--enable some parts of the chargen sequence
runConsole(pid, "set CharGenState to 10", false)
--skip jiub's question about player's name
runConsole(pid, "set \"chargen name\".state to 20", false)
--make the boat guard walk as normal
runConsole(pid, "set \"chargen boat guard 2\".state to 0", false)
--disable most speech and movement for the dock guard
runConsole(pid, "set \"chargen dock guard\".state to -1", false)
--disable ergala chargen
runConsole(pid, "set \"chargen class\".state to -1", false)
--allow to enter captain's room without the engraved ring
runConsole(pid, "set \"chargen door captain\".done to 1", false)
--allow to leave the building without the package
runConsole(pid, "set \"CharGen Exit Door\".done to 1", false)
end
function Start.fixLogin(pid)
Start.data.chargenPlayers[Start.getPlayerName(pid)] = nil
--disable most of the obtrusive chargen logic
runConsole(pid, "set CharGenState to -1", false)
--no speech from saint jiub
runConsole(pid, "set \"chargen name\".state to -1", false)
--boat guard walks to the hatch
runConsole(pid, "set \"chargen boat guard 2\".state to 40", false)
--no speech from the woman inside the boat
runConsole(pid, "set \"chargen boat guard 3\".state to 1", false)
--no message when leaving through the boat hatch
runConsole(pid, "set \"chargen_shipdoor\".done to 1", false)
--no speech from the redguard on the boat
runConsole(pid, "set \"chargen boat guard 1\".state to 10", false)
--disable most speech and movement for the dock guard
runConsole(pid, "set \"chargen dock guard\".state to -1", false)
--disable ergala chargen
runConsole(pid, "set \"chargen class\".state to -1", false)
--no message when picking up the stat sheet
runConsole(pid, "set \"chargen statssheet\".state to 20", false)
--no speech from the guard at the door
runConsole(pid, "set \"chargen door guard\".done to 1", false)
--no message when taking the chargen dagger
runConsole(pid, "set \"chargen dagger\".done to 1", false)
--no message when sleeping on the bed in the census cellar
runConsole(pid, "set \"CharGen_Bed\".done to 1", false)
--no message after leaving main census building
runConsole(pid, "set \"CharGen Exit Door\".done to 1", false)
--no message about having a map
runConsole(pid, "set \"chargen barrel fatigue\".done to 1", false)
--no message about engraved ring
runConsole(pid, "set \"ring_keley\".state to 30", false)
--allow to enter captain's room without the engraved ring
runConsole(pid, "set \"chargen door captain\".done to 1", false)
--no message about Gravius
runConsole(pid, "set \"CharGen Captain\".state to -1", false)
--allow to leave the building without the package
runConsole(pid, "set \"CharGen Captain\".done to 1", false)
--no message about having a journal
runConsole(pid, "set \"chargendoorjournal\".done to 1", false)
end
function Start.OnPlayerEndCharGenV(eventStatus, pid)
if WorldInstance.data.customVariables == nil then
WorldInstance.data.customVariables = {}
end
Start.deliveredCaiusPackage = WorldInstance.data.customVariables.deliveredCaiusPackage
--disable the message about starting area being broken
WorldInstance.data.customVariables.deliveredCaiusPackage = true
end
function Start.OnPlayerEndCharGen(eventStatus, pid)
--return to the previous value
WorldInstance.data.customVariables.deliveredCaiusPackage = Start.deliveredCaiusPackage
if not Start.config.CHANGE_CONFIG_SPAWN then
Start.teleportToSpawn(pid)
end
Start.fixCharGen(pid)
--ДАЛЬШЕ ВЫ НЕ ПРОЙДЕТЕ ПОКА НЕ ПОЛУЧИТЕ БУМАГИ https://youtu.be/ppSPsvO19dU
Start.AddItem(pid, "CharGen StatsSheet")
end
customEventHooks.registerValidator("OnPlayerEndCharGen", Start.OnPlayerEndCharGenV)
customEventHooks.registerHandler("OnPlayerEndCharGen", Start.OnPlayerEndCharGen)
function Start.OnPlayerFinishLogin(eventStatus, pid)
if eventStatus.validCustomHandlers then
if Start.isPlayerChargen(pid) then
Start.fixCharGen(pid)
else
Start.fixLogin(pid)
end
end
end
customEventHooks.registerHandler("OnPlayerFinishLogin", Start.OnPlayerFinishLogin)
Start.CellFixData = {}
-- Delete the chargen scroll as we already gave it to the player
Start.CellFixData[Start.OFFICE] = { 172859 }
if Start.config.START_ON_DOCK then
-- Delete the chargen boat and associated guards and objects
Start.CellFixData["-1, -9"] = { 268178, 297457, 297459, 297460, 299125 }
Start.CellFixData["-2, -9"] = { 172848, 172850, 289104, 297461, 397559 }
Start.CellFixData["-2, -10"] = { 297463, 297464, 297465, 297466 }
end
function Start.OnCellLoad(eventStatus, pid, cellDescription)
if eventStatus.validCustomHandlers then
if Start.CellFixData[cellDescription] ~= nil then
tes3mp.ClearObjectList()
tes3mp.SetObjectListPid(pid)
tes3mp.SetObjectListCell(cellDescription)
for _, refNum in pairs(Start.CellFixData[cellDescription]) do
tes3mp.SetObjectRefNum(refNum)
tes3mp.SetObjectMpNum(0)
tes3mp.SetObjectRefId("")
tes3mp.AddObject()
end
tes3mp.SendObjectDelete()
end
end
end
customEventHooks.registerHandler("OnCellLoad", Start.OnCellLoad)
function Start.OnPlayerCellChange(eventStatus, pid)
local cellDescription = tes3mp.GetCell(pid)
if Start.isPlayerChargen(pid) then
--player has left the chargen area
if Start.CHARGEN_CELLS[cellDescription] == nil then
Start.fixLogin(pid)
end
end
if cellDescription == Start.OFFICE then
--unlock the census office doors
local cellData = LoadedCells[cellDescription].data
for refId, uniqueIndex in pairs(Start.OFFICE_DOORS) do
if cellData.objectData[uniqueIndex] ~= nil then
if cellData.objectData[uniqueIndex].lockLevel ~= 0 then
cellData.objectData[uniqueIndex].lockLevel = 0
end
else
cellData.objectData[uniqueIndex] = {
lockLevel = 0,
refId = refId
}
end
end
LoadedCells[cellDescription]:LoadObjectsLocked(pid, cellData.objectData, Start.OFFICE_DOORS)
end
end
customEventHooks.registerHandler("OnPlayerCellChange", Start.OnPlayerCellChange)
function Start.cleanDockCell(pid, cellDescription)
--clean up garbage objects spawned during character creation
if cellDescription == "-2, -9" then
local targetRefId = "chargencollision - extra"
local cellData = LoadedCells[cellDescription].data
for uniqueIndex, data in pairs(cellData.objectData) do
if data.refId == targetRefId then
cellData.objectData[uniqueIndex] = nil
end
end
end
end
if Start.config.CLEAN_ON_UNLOAD then
customEventHooks.registerValidator("OnCellUnload", function(eventStatus, pid, cellDescription)
if eventStatus.validCustomHandlers then
Start.cleanDockCell(pid, cellDescription)
end
end)
end
function Start.OnServerExit(eventStatus)
if eventStatus.validCustomHandlers then
DataManager.saveData(Start.scriptName, Start.data)
end
end
customEventHooks.registerHandler("OnServerExit", Start.OnServerExit)
function Start.OnObjectActivate(eventStatus, pid, cellDescription, objects, players)
if eventStatus.validCustomHandlers then
if Start.isPlayerChargen(pid) then
for _, obj in pairs(objects) do
if obj.uniqueIndex == Start.EXIT_DOOR then
Start.fixLogin(pid)
break
end
end
end
end
end
customEventHooks.registerHandler("OnObjectActivate", Start.OnObjectActivate)
return Start