View difference between Paste ID: kLHWDkdx and RT0P762M
SHOW: | | - or go back to the newest paste.
1
Scriptname zzzContainerWeightCap extends ReferenceAlias
2
 
3
Actor Property PlayerRef Auto
4
Keyword Property VendorItemArrow Auto
5
Float fMax
6
Float fCurrent
7
Bool bScanContainer
8
 
9
string[] contweight_10
10
string[] contweight_25
11
string[] contweight_30
12
string[] contweight_50
13
string[] contweight_75
14
string[] contweight_100
15
string[] contweight_125
16
string[] contweight_150
17
string[] contweight_175
18
string[] contweight_200
19
string[] contweight_225
20
 
21
 
22
Event OnInit()
23
    InitializeArrays()
24
    RegisterForMenu("ContainerMenu")
25
EndEvent
26
 
27
 
28
Event OnMenuOpen(String MenuName)
29
    If MenuName == "ContainerMenu"
30-
        bScanContainer = True      
30+
        bScanContainer = True
31
    EndIf
32
EndEvent
33
 
34
 
35
Event OnMenuClose(String MenuName)
36
    If MenuName == "ContainerMenu"
37
        bScanContainer = False
38
        fCurrent = 0.0
39
    EndIf
40
EndEvent
41
 
42
Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)
43
    If ( akSourceContainer != None )
44-
    WeightChange(False, akBaseItem, aiItemCount, akItemReference, akSourceContainer)
44+
		WeightChange(False, akBaseItem, aiItemCount, akItemReference, akSourceContainer)
45
	endIF
46
endEvent
47
 
48
Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
49-
    WeightChange(True, akBaseItem, aiItemCount, akItemReference, akDestContainer)
49+
    If ( akDestContainer != None )
50
    	WeightChange(True, akBaseItem, aiItemCount, akItemReference, akDestContainer)
51
	endIf
52
endEvent
53
54
 
55
Function WeightChange(Bool akAdded, Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akContainer)
56
; akAdded will be TRUE if an item has been added to a container, and FALSE if the player has retrieved an item from a container
57
58
Float fItemWeight
59
60
    If ( UI.IsMenuOpen("ContainerMenu") && akContainer != None && akContainer as Actor == None )
61-
        ;If so, get the expected maximum weight, and current weight of the container
61+
62
        ;Allow for the fact that arrows have no weight, and calculate item weight * number of items
63
        If ( akBaseItem.HasKeyword(VendorItemArrow) == 1 )
64-
            fCurrent = weighContentsIn(akContainer) ;Will return current weight with new item(s) added/removed, NOT weight before
64+
65
        else
66
            fItemWeight = akBaseItem.GetWeight()*aiItemCount
67
        endIf
68
69
        ;Check to see if this is the first item to be handled since container was opened
70
        ;If so, get the expected maximum weight
71
        If ( bScanContainer == True )
72
            fMax = getMaxWeight(akContainer)
73
            bScanContainer = False
74
75
			;Get current weight of the container
76
	        If ( akAdded == True )
77-
            ; Artificially adjust current weight if arrows were added
77+
				;On an 'Add' event, handle the fact that it will return current weight with new item(s)
78-
            If ( akBaseItem.HasKeyword(VendorItemArrow) == 1 )
78+
				;added, NOT weight before
79-
                fCurrent += fItemWeight
79+
				fCurrent = weighContentsIn(akContainer) - fItemWeight
80-
            endIF
80+
			Else
81
				;On a 'Remove' event, the scanned weight will already be missing the removed item(s).
82
				fCurrent = weighContentsIn(akContainer)
83
			endIf
84-
            If ( fCurrent > fMax )
84+
85-
                If ( akItemReference != None )
85+
86-
                    akContainer.RemoveItem(akItemReference, aiItemCount, True, PlayerRef)
86+
87-
                Else
87+
88-
                    akContainer.RemoveItem(akBaseItem, aiItemCount, True, PlayerRef)
88+
89-
                endIf
89+
90-
                fCurrent -= fItemWeight
90+
            If ( fCurrent + fItemWeight > fMax )
91-
                Debug.Notification("This won't fit.")
91+
				;Work out where to split the stack (if more than one item was moved)
92-
                Debug.Notification("Current weight in container: " + fCurrent as Int + " of " + fMax as Int)
92+
				int iAcceptedItemCount = ( (fMax - fCurrent) / (fItemWeight / aiItemCount) ) As Int
93
				int iRejectedItemCount = ( aiItemCount - iAcceptedItemCount )
94
95-
        else ;Item was removed from a container by the player. Artificially adjust current weight only if arrows were removed
95+
                Debug.Notification("This won't fit")
96-
            If ( akBaseItem.HasKeyword(VendorItemArrow) == 1 )
96+
97-
                fCurrent -= fItemWeight
97+
				fCurrent += fItemWeight
98-
            endIF
98+
99
				If ( akItemReference != None )
100
	                akContainer.RemoveItem(akItemReference, iRejectedItemCount, True, PlayerRef)
101
       	        Else
102
           	        akContainer.RemoveItem(akBaseItem, iRejectedItemCount, True, PlayerRef)
103
               	endIf
104
105
			Else
106
				fCurrent += fItemWeight
107
				Debug.Notification("Space left in container: " + ( fMax - fCurrent ) as Int + " of " + fMax as Int)
108
            endIf
109
110
        else ;Item was removed from a container by the player.
111
112
			;If this is the first run since the container weight was scanned, we already have the weight minus the removed items
113
			;If not, minus the item weight from the container weight.
114
        	If ( bScanContainer != True )
115
				fCurrent -= fItemWeight
116
				If fCurrent < 0
117
					fCurrent = 0
118
				endIf
119
        	endIf
120
			Debug.Notification("Space left in container: " + ( fMax - fCurrent ) as Int + " of " + fMax as Int)
121
		endIf
122
    endIf
123
endFunction
124
 
125
 
126
Function InitializeArrays()
127
;Set total in [] if adding to a list
128
 
129
    contweight_10 = new string[1]
130
    contweight_10[0] = "Clutter\\Containers\\Satchel.nif"
131
 
132
    contweight_25 = new string[4]
133
    contweight_25[0] = "Clutter\\Containers\\MiscSackSmall.nif"
134
    contweight_25[1] = "Clutter\\Containers\\MiscSack02Small.nif"
135
    contweight_25[2] = "Clutter\\Containers\\MiscSack02SmallFlat.nif"
136
    contweight_25[3] = "Clutter\\Common\\StrongBox01.nif"
137
 
138
    contweight_30 = new string[2]
139
    contweight_30[0] = "Clutter\\WoodFires\\SpitPotClosedLoose01.nif"
140
    contweight_30[1] = "Clutter\\WoodFires\\SpitPotClosed01.nif"
141
 
142
    contweight_50 = new string[6]
143
    contweight_50[0] = "Architecture\\WhiteRun\\WRClutter\\WRBurialUrn01.nif"
144
    contweight_50[1] = "Clutter\\Sack01.NIF"
145
    contweight_50[2] = "Clutter\\SBurialUrn01.nif"
146
    contweight_50[3] = "Clutter\\Containers\\MiscPouch.nif"
147
    contweight_50[4] = "Clutter\\Ruins\\RuinsCanopicJar01.nif"
148
    contweight_50[5] = "Clutter\\Ruins\\RuinsCanopicJar02.nif"
149
 
150
    contweight_75 = new string[8]
151
    contweight_75[0] = "Clutter\\Containers\\MiscSackLarge.nif"
152
    contweight_75[1] = "Clutter\\Containers\\MiscSackLargeFlat01.nif"
153
    contweight_75[2] = "Clutter\\Containers\\MiscSackLargeFlat02.nif"
154
    contweight_75[3] = "Clutter\\Containers\\MiscSackLargeFlat03.nif"
155
    contweight_75[4] = "Clutter\\Containers\\MiscSack02Large.nif"
156
    contweight_75[5] = "Clutter\\Containers\\MiscSack02LargeFlat.nif"
157
    contweight_75[6] = "Effects\\FXSpiderWebKitSkeeverDinner.nif"
158
    contweight_75[7] = "Effects\\FXSpiderWebKitDinner.nif"
159
 
160
    contweight_100 = new string[6]
161
    contweight_100[0] = "Clutter\\Common\\EndTable01.nif"
162
    contweight_100[1] = "Clutter\\Ruins\\RuinsLargeUrnWithStand01.nif"
163
    contweight_100[2] = "Clutter\\Upperclass\\UpperEndTable01.nif"
164
    contweight_100[3] = "Furniture\\Noble\\NobleNightTable01.nif"
165
    contweight_100[4] = "Furniture\\OrcFurniture\\OrcEndTable01.nif"
166
    contweight_100[5] = "_BYOH\\Furniture\\BYOHUpperEndTable02.nif"
167
 
168
    contweight_125 = new string[27]
169
    contweight_125[0] = "Architecture\\WhiteRun\\WRClutter\\WRCoffin01.nif"
170
    contweight_125[1] = "Architecture\\Riften\\Clutter\\RTCoffin01.nif"
171
    contweight_125[2] = "Clutter\\Barrel01.NIF"
172
    contweight_125[3] = "Clutter\\Common\\Cupboard01.nif"
173
    contweight_125[4] = "Clutter\\Common\\Dresser01.nif"
174
    contweight_125[5] = "Clutter\\Common\\Wardrobe01.nif"
175
    contweight_125[6] = "Clutter\\Common\\CommonCoffin01.nif"
176
    contweight_125[7] = "Clutter\\Containers\\SafeandLock01.nif"
177
    contweight_125[8] = "Clutter\\Dwemer\\DweDresser01.nif"
178
    contweight_125[9] = "Clutter\\Sovngarde\\SovBarrel01.nif"
179
    contweight_125[10] = "Clutter\\Upperclass\\UpperCupboard.nif"
180
    contweight_125[11] = "Clutter\\Upperclass\\UpperDresser01.nif"
181
    contweight_125[12] = "Clutter\\Upperclass\\UpperWardrobe01.nif"
182
    contweight_125[13] = "Clutter\\Windhelm\\WHcoffin01.nif"
183
    contweight_125[14] = "Dungeons\\Dwemer\\Clutter\\MrkCryptCoffin01container.nif"
184
    contweight_125[15] = "Dungeons\\Dwemer\\Clutter\\MrkCryptCoffin02container.nif"
185
    contweight_125[16] = "Furniture\\OrcFurniture\\OrcDresser01.nif"
186
    contweight_125[17] = "Dungeons\\Dwemer\\Clutter\\MrkCryptCoffin01container.nif"
187
    contweight_125[18] = "Dungeons\\Dwemer\\Clutter\\MrkCryptCoffin02container.nif"
188
    contweight_125[19] = "Furniture\\OrcFurniture\\OrcDresser01.nif"
189
    contweight_125[20] = "Furniture\\Noble\\NobleChestDrawers01.nif"
190
    contweight_125[21] = "Furniture\\Noble\\NobleChestDrawers02.nif"
191
    contweight_125[22] = "Furniture\\Noble\\NobleWardrobe01.nif"
192
    contweight_125[23] = "Furniture\\Noble\\SCoffin.nif"
193
    contweight_125[24] = "Furniture\\Noble\\SCoffinPoor.nif"
194
    contweight_125[25] = "DLC02\\Dungeons\\Apocrypha\\Animated\\ApoUrn\\ApoUrn01.nif"
195
    contweight_125[26] = "DLC02\\Clutter\\DLC2DarkElfUrn01.nif"
196
 
197
    contweight_150 = new string[2]
198
    contweight_150[0] = "Clutter\\Dwemer\\DweContainter02.nif"
199
    contweight_150[1] = "DLC02\\Dungeons\\Apocrypha\\Animated\\ApoUrn\\ApoUrn02.nif"
200
 
201
    contweight_175 = new string[2]
202
    contweight_175[0] = "Clutter\\Ruins\\Ruins_SmallChest.nif"
203
    contweight_175[1] = "DLC02\\Architecture\\Riekling\\DLC2RieklingTent01.nif"
204
 
205
    contweight_200 = new string[6]
206
    contweight_200[0] = "Clutter\\Containers\\Chest01\\Chest01.nif"
207
    contweight_200[1] = "Clutter\\Falmer\\FalmerContainer.nif"
208
    contweight_200[2] = "Clutter\\Upperclass\\UpperChest01.nif"
209
    contweight_200[3] = "DLC01\\Clutter\\DLC01SnowElfChest.nif"
210
    contweight_200[4] = "DLC01\\SoulCairn\\sc_chest.nif"
211
    contweight_200[5] = "DLC01\\SoulCairn\\sc_chest02.nif"
212
 
213
    contweight_225 = new string[5]
214
    contweight_225[0] = "Clutter\\Dwemer\\DweChest01.nif"
215
    contweight_225[1] = "Clutter\\Dwemer\\DweContainer01.nif"
216
    contweight_225[2] = "Clutter\\Falmer\\FalmerContainer02.nif"
217
    contweight_225[3] = "Clutter\\Ruins\\Ruins_LargeChest.nif"
218
    contweight_225[4] = "Furniture\\Noble\\NobleChest01.nif"
219
endFunction
220
 
221
 
222
Float Function getMaxWeight(ObjectReference oSourceContainer)
223
; Decide the max weight of the container
224
 
225
    string sModelPath = oSourceContainer.GetBaseObject().GetWorldModelPath()
226
 
227
        If contweight_10.Find(sModelPath) != -1
228
        return 10.0
229
    ElseIf contweight_25.Find(sModelPath) != -1
230
        return 25.0
231
    ElseIf contweight_30.Find(sModelPath) != -1
232
        return 30.0
233
    ElseIf contweight_50.Find(sModelPath) != -1
234
        return 50.0
235
    ElseIf contweight_75.Find(sModelPath) != -1
236
        return 75.0
237
    ElseIf contweight_100.Find(sModelPath) != -1
238
        return 100.0
239
    ElseIf contweight_125.Find(sModelPath) != -1
240
        return 125.0
241
    ElseIf contweight_150.Find(sModelPath) != -1
242
        return 150.0
243
    ElseIf contweight_175.Find(sModelPath) != -1
244
        return 175.0
245
    ElseIf contweight_200.Find(sModelPath) != -1
246
        return 200.0
247
    ElseIf contweight_225.Find(sModelPath) != -1
248
        return 225.0
249
    Else
250
        return 150.0
251
    EndIf
252
endFunction
253
 
254
 
255
Float Function weighContentsIn(ObjectReference akContainer)
256
    Float iTotal
257
 
258
    Int iFormIndex = akContainer.GetNumItems()
259
    While iFormIndex > 0
260
        iFormIndex -= 1
261
        Form kForm = akContainer.GetNthForm(iFormIndex)
262
 
263
        ;Allow for the fact that arrows have no weight, and calculate item weight * number of items
264
        If ( kForm.HasKeyword(VendorItemArrow) == 1 )
265
            iTotal += akContainer.GetItemCount(kForm) * 0.1
266
        else
267
            iTotal += akContainer.GetItemCount(kForm) * kForm.GetWeight()
268
        endIf
269
 
270
    EndWhile
271
    Return iTotal
272
endFunction