h1z1-server 0.23.5-2 → 0.23.5-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/servers/ZoneServer2016/classes/loadoutcontainer.ts +219 -235
- package/src/servers/ZoneServer2016/commands/dev.ts +653 -623
- package/src/servers/ZoneServer2016/data/Recipes.ts +2536 -2535
- package/src/servers/ZoneServer2016/entities/lootableprop.ts +207 -211
- package/src/servers/ZoneServer2016/managers/decaymanager.ts +174 -158
- package/src/servers/ZoneServer2016/managers/worldobjectmanager.ts +545 -546
- package/src/servers/ZoneServer2016/zoneserver.ts +7251 -7272
package/package.json
CHANGED
|
@@ -1,235 +1,219 @@
|
|
|
1
|
-
// ======================================================================
|
|
2
|
-
//
|
|
3
|
-
// GNU GENERAL PUBLIC LICENSE
|
|
4
|
-
// Version 3, 29 June 2007
|
|
5
|
-
// copyright (C) 2020 - 2021 Quentin Gruber
|
|
6
|
-
// copyright (C) 2021 - 2023 H1emu community
|
|
7
|
-
//
|
|
8
|
-
// https://github.com/QuentinGruber/h1z1-server
|
|
9
|
-
// https://www.npmjs.com/package/h1z1-server
|
|
10
|
-
//
|
|
11
|
-
// Based on https://github.com/psemu/soe-network
|
|
12
|
-
// ======================================================================
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
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
|
-
* @param
|
|
91
|
-
* @param
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
*
|
|
110
|
-
* @param
|
|
111
|
-
* @param
|
|
112
|
-
* @param
|
|
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
|
-
item
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const
|
|
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
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
server
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
);
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
item.stackCount += count;
|
|
221
|
-
server.updateContainerItem(client, item, targetContainer);
|
|
222
|
-
} else {
|
|
223
|
-
// add item to end
|
|
224
|
-
combineItemStack(
|
|
225
|
-
server,
|
|
226
|
-
client,
|
|
227
|
-
oldStackCount,
|
|
228
|
-
targetContainer,
|
|
229
|
-
item,
|
|
230
|
-
count
|
|
231
|
-
);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
1
|
+
// ======================================================================
|
|
2
|
+
//
|
|
3
|
+
// GNU GENERAL PUBLIC LICENSE
|
|
4
|
+
// Version 3, 29 June 2007
|
|
5
|
+
// copyright (C) 2020 - 2021 Quentin Gruber
|
|
6
|
+
// copyright (C) 2021 - 2023 H1emu community
|
|
7
|
+
//
|
|
8
|
+
// https://github.com/QuentinGruber/h1z1-server
|
|
9
|
+
// https://www.npmjs.com/package/h1z1-server
|
|
10
|
+
//
|
|
11
|
+
// Based on https://github.com/psemu/soe-network
|
|
12
|
+
// ======================================================================
|
|
13
|
+
|
|
14
|
+
import { ContainerErrors } from "../models/enums";
|
|
15
|
+
import { ZoneServer2016 } from "../zoneserver";
|
|
16
|
+
import { BaseItem } from "./baseItem";
|
|
17
|
+
import { LoadoutItem } from "./loadoutItem";
|
|
18
|
+
import { ZoneClient2016 } from "./zoneclient";
|
|
19
|
+
|
|
20
|
+
// helper functions
|
|
21
|
+
function combineItemStack(
|
|
22
|
+
server: ZoneServer2016,
|
|
23
|
+
client: ZoneClient2016,
|
|
24
|
+
oldStackCount: number,
|
|
25
|
+
targetContainer: LoadoutContainer,
|
|
26
|
+
item: BaseItem,
|
|
27
|
+
count: number
|
|
28
|
+
) {
|
|
29
|
+
if (oldStackCount == count) {
|
|
30
|
+
// if full stack is moved
|
|
31
|
+
server.addContainerItem(client.character, item, targetContainer, false);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// if only partial stack is moved
|
|
35
|
+
server.addContainerItem(
|
|
36
|
+
client.character,
|
|
37
|
+
server.generateItem(item.itemDefinitionId, count),
|
|
38
|
+
targetContainer,
|
|
39
|
+
false
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class LoadoutContainer extends LoadoutItem {
|
|
44
|
+
containerDefinitionId: number;
|
|
45
|
+
items: { [itemGuid: string]: BaseItem } = {};
|
|
46
|
+
canAcceptItems: boolean = true;
|
|
47
|
+
acceptedItems: number[] = [];
|
|
48
|
+
readonly isMutable: boolean = true;
|
|
49
|
+
constructor(item: LoadoutItem, containerDefinitionId: number) {
|
|
50
|
+
super(item, item.slotId, item.loadoutItemOwnerGuid);
|
|
51
|
+
this.containerDefinitionId = containerDefinitionId;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Gets the used bulk of this container.
|
|
56
|
+
* @param server The ZoneServer instance.
|
|
57
|
+
* @returns Returns the amount of bulk used.
|
|
58
|
+
*/
|
|
59
|
+
getUsedBulk(server: ZoneServer2016): number {
|
|
60
|
+
let bulk = 0;
|
|
61
|
+
for (const item of Object.values(this.items)) {
|
|
62
|
+
bulk +=
|
|
63
|
+
server.getItemDefinition(item.itemDefinitionId).BULK * item.stackCount;
|
|
64
|
+
}
|
|
65
|
+
return bulk;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Gets the maximum bulk that this container can hold.
|
|
70
|
+
* @param server The ZoneServer instance.
|
|
71
|
+
*/
|
|
72
|
+
getMaxBulk(server: ZoneServer2016): number {
|
|
73
|
+
return server.getContainerDefinition(this.containerDefinitionId).MAX_BULK;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Gets the available bulk for this container.
|
|
78
|
+
* @param server The ZoneServer instance.
|
|
79
|
+
* @returns Returns the amount of bulk available.
|
|
80
|
+
*/
|
|
81
|
+
getAvailableBulk(server: ZoneServer2016): number {
|
|
82
|
+
const availableBulk = this.getMaxBulk(server) - this.getUsedBulk(server);
|
|
83
|
+
// prevents returning a negative available bulk for containers with 0 max bulk
|
|
84
|
+
return availableBulk <= 0 ? 0 : availableBulk;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Returns a boolean if this container has enough space for a given amount of a certain item.
|
|
89
|
+
* @param server The ZoneServer instance.
|
|
90
|
+
* @param itemDefinitionId The definiton id of the item to check.
|
|
91
|
+
* @param count The amount of the item to check.
|
|
92
|
+
*/
|
|
93
|
+
getHasSpace(
|
|
94
|
+
server: ZoneServer2016,
|
|
95
|
+
itemDefinitionId: number,
|
|
96
|
+
count: number
|
|
97
|
+
): boolean {
|
|
98
|
+
if (this.getMaxBulk(server) == 0) return true; // for external containers
|
|
99
|
+
return !!(
|
|
100
|
+
this.getMaxBulk(server) -
|
|
101
|
+
(this.getUsedBulk(server) +
|
|
102
|
+
server.getItemDefinition(itemDefinitionId).BULK * count) >=
|
|
103
|
+
0
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Gets an item stack in a container that has space for a specified item.
|
|
109
|
+
* @param server The ZoneServer instance.
|
|
110
|
+
* @param itemDefId The item definition ID of the item stack to check.
|
|
111
|
+
* @param count The amount of items to fit into the stack.
|
|
112
|
+
* @param slotId Optional: The slotId of a specific item stack to check.
|
|
113
|
+
* @returns Returns the itemGuid of the item stack.
|
|
114
|
+
*/
|
|
115
|
+
getAvailableItemStack(
|
|
116
|
+
server: ZoneServer2016,
|
|
117
|
+
itemDefId: number,
|
|
118
|
+
count: number
|
|
119
|
+
): string {
|
|
120
|
+
//
|
|
121
|
+
// if slotId is defined, then only an item with the same slotId will be returned
|
|
122
|
+
if (server.getItemDefinition(itemDefId).MAX_STACK_SIZE == 1) return "";
|
|
123
|
+
for (const item of Object.values(this.items)) {
|
|
124
|
+
if (
|
|
125
|
+
item.itemDefinitionId == itemDefId &&
|
|
126
|
+
server.getItemDefinition(item.itemDefinitionId).MAX_STACK_SIZE >=
|
|
127
|
+
item.stackCount + count
|
|
128
|
+
) {
|
|
129
|
+
return item.itemGuid;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return "";
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Gets the maximum slots that this container can hold.
|
|
137
|
+
* @param server The ZoneServer instance.
|
|
138
|
+
*/
|
|
139
|
+
getMaxSlots(server: ZoneServer2016) {
|
|
140
|
+
return server.getContainerDefinition(this.containerDefinitionId)
|
|
141
|
+
.MAXIMUM_SLOTS;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// transfers an item from this container to another
|
|
145
|
+
transferItem(
|
|
146
|
+
server: ZoneServer2016,
|
|
147
|
+
targetContainer: LoadoutContainer,
|
|
148
|
+
item: BaseItem,
|
|
149
|
+
newSlotId: number,
|
|
150
|
+
count?: number
|
|
151
|
+
) {
|
|
152
|
+
if (!count) count = item.stackCount;
|
|
153
|
+
const oldStackCount = item.stackCount; // saves stack count before it gets altered
|
|
154
|
+
|
|
155
|
+
let client;
|
|
156
|
+
|
|
157
|
+
const lootableEntity = server.getLootableEntity(this.loadoutItemOwnerGuid);
|
|
158
|
+
if (lootableEntity) {
|
|
159
|
+
const mountedCharacterId = lootableEntity.mountedCharacter;
|
|
160
|
+
if (mountedCharacterId)
|
|
161
|
+
client = server.getClientByCharId(mountedCharacterId);
|
|
162
|
+
} else {
|
|
163
|
+
client = server.getClientByCharId(this.loadoutItemOwnerGuid);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (!client) return;
|
|
167
|
+
|
|
168
|
+
if (!targetContainer.canAcceptItems) {
|
|
169
|
+
server.containerError(client, ContainerErrors.DOES_NOT_ACCEPT_ITEMS);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (
|
|
174
|
+
targetContainer.acceptedItems.length &&
|
|
175
|
+
!targetContainer.acceptedItems.includes(item.itemDefinitionId)
|
|
176
|
+
) {
|
|
177
|
+
server.containerError(client, ContainerErrors.UNACCEPTED_ITEM);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (!this.isMutable || !targetContainer.isMutable) {
|
|
182
|
+
server.containerError(client, ContainerErrors.NOT_MUTABLE);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (
|
|
187
|
+
this.containerGuid != targetContainer.containerGuid &&
|
|
188
|
+
!targetContainer.getHasSpace(server, item.itemDefinitionId, count)
|
|
189
|
+
) {
|
|
190
|
+
// allows items in the same container but different stacks to be stacked
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (!server.removeContainerItem(client.character, item, this, count)) {
|
|
194
|
+
server.containerError(client, ContainerErrors.NO_ITEM_IN_SLOT);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const itemStack = targetContainer.getAvailableItemStack(
|
|
198
|
+
server,
|
|
199
|
+
item.itemDefinitionId,
|
|
200
|
+
count
|
|
201
|
+
);
|
|
202
|
+
if (itemStack) {
|
|
203
|
+
// add to existing item stack
|
|
204
|
+
const item = targetContainer.items[itemStack];
|
|
205
|
+
item.stackCount += count;
|
|
206
|
+
server.updateContainerItem(client, item, targetContainer);
|
|
207
|
+
} else {
|
|
208
|
+
// add item to end
|
|
209
|
+
combineItemStack(
|
|
210
|
+
server,
|
|
211
|
+
client,
|
|
212
|
+
oldStackCount,
|
|
213
|
+
targetContainer,
|
|
214
|
+
item,
|
|
215
|
+
count
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|