@@ -11,6 +11,17 @@ import {
11
11
import { Player } from '@engine/world/actor/player/player' ;
12
12
import { findItem } from '@engine/config' ;
13
13
import { TaskExecutor } from '@engine/world/action' ;
14
+ import { Position } from '@engine/world/position' ;
15
+
16
+ /**
17
+ * The amount of items the player wants to forge.
18
+ */
19
+ let wantedAmount = 0 ;
20
+
21
+ /**
22
+ * The amount of items already forged.
23
+ */
24
+ let forgedAmount = 0 ;
14
25
15
26
const mapWidgetItemsToFlatArray = ( input ) => {
16
27
const result = [ ] ;
@@ -32,20 +43,25 @@ const mapToFlatArray = (input) => {
32
43
return results ;
33
44
} ;
34
45
46
+ /**
47
+ * Lookup a smithable from just an item id.
48
+ * @param itemId
49
+ */
35
50
const findSmithableByItemId = ( itemId ) : Smithable => {
36
51
return mapToFlatArray ( smithables ) . find ( ( smithable ) => {
37
52
return smithable . item . itemId === itemId ;
38
53
} ) ;
39
54
} ;
40
55
56
+ /**
57
+ * Check if the player is able to perform the action.
58
+ * @param task
59
+ */
41
60
const canActivate = ( task : TaskExecutor < ItemInteractionAction > ) : boolean => {
42
- const { actor, player, actionData, session } = task . getDetails ( ) ;
43
-
61
+ const { actor, player, actionData } = task . getDetails ( ) ;
44
62
const itemId = actionData . itemId ;
45
-
46
63
const smithable = findSmithableByItemId ( itemId ) ;
47
64
48
-
49
65
// In case the smithable doesn't exist.
50
66
if ( ! smithable ) {
51
67
return false ;
@@ -58,27 +74,26 @@ const canActivate = (task: TaskExecutor<ItemInteractionAction>): boolean => {
58
74
return false ;
59
75
}
60
76
61
- const amountInInventory = player . inventory . findAll ( smithable . ingredient . itemId ) . length ;
62
- // @todo : Forging: Make a check for sufficient bars in the inventory.
63
-
64
- if ( ! hasIngredients ( player , smithable ) ) {
65
- player . interfaceState . closeAllSlots ( ) ;
77
+ // Check if the player has sufficient materials.
78
+ if ( ! hasMaterials ( player , smithable ) ) {
66
79
const bar = findItem ( smithable . ingredient . itemId ) ;
67
80
player . sendMessage ( `You don't have enough ${ bar . name } s.` , true ) ;
68
81
return false ;
69
82
}
70
83
84
+ player . interfaceState . closeAllSlots ( ) ;
85
+
71
86
return true ;
72
87
} ;
73
88
74
- let wantedAmount = 0 ;
75
- let forgedAmount = 0 ;
76
-
89
+ /**
90
+ * The actual forging loop.
91
+ * @param task
92
+ * @param taskIteration
93
+ */
77
94
const activate = ( task : TaskExecutor < ItemInteractionAction > , taskIteration : number ) : boolean => {
78
95
const { player, actionData } = task . getDetails ( ) ;
79
-
80
96
const itemId = actionData . itemId ;
81
-
82
97
const smithable = findSmithableByItemId ( itemId ) ;
83
98
84
99
// How many? Quick and dirty.
@@ -88,44 +103,58 @@ const activate = (task: TaskExecutor<ItemInteractionAction>, taskIteration: numb
88
103
case 'make-10' : wantedAmount = 10 ; break ;
89
104
}
90
105
91
- player . interfaceState . closeAllSlots ( ) ;
92
- player . playAnimation ( 898 ) ;
106
+ for ( let m = 0 ; m < wantedAmount ; m ++ ) {
107
+ player . playAnimation ( 898 ) ;
108
+ if ( taskIteration % 4 === 0 ) {
109
+ if ( ! hasMaterials ( player , smithable ) || wantedAmount === forgedAmount ) {
110
+ return false ;
111
+ }
93
112
94
- if ( taskIteration % 4 === 0 && taskIteration != 0 ) {
95
- if ( ! hasIngredients ( player , smithable ) || wantedAmount === forgedAmount ) {
96
- return false ;
97
- }
113
+ // Remove ingredients
114
+ for ( let i = 0 ; i < smithable . ingredient . amount ; i ++ ) {
115
+ player . inventory . removeFirst ( smithable . ingredient . itemId ) ;
116
+ }
117
+
118
+ // Add item to inventory
119
+ player . inventory . add ( {
120
+ itemId : smithable . item . itemId , amount : smithable . item . amount
121
+ } ) ;
98
122
99
- // Remove ingredients
100
- for ( let i = 0 ; i < smithable . ingredient . amount ; i ++ ) {
101
- player . inventory . removeFirst ( smithable . ingredient . itemId ) ;
102
123
player . outgoingPackets . sendUpdateAllWidgetItems ( widgets . inventory , player . inventory ) ;
103
- }
124
+ player . skills . addExp ( Skill . SMITHING , smithable . experience ) ;
104
125
105
- // Add item to inventory
106
- for ( let i = 0 ; i < smithable . item . amount ; i ++ ) {
107
- player . inventory . add ( smithable . item . itemId ) ;
126
+ forgedAmount ++ ;
127
+ return true ;
108
128
}
109
-
110
- // Give the experience
111
- player . skills . addExp ( Skill . SMITHING , smithable . experience ) ;
112
-
113
- forgedAmount ++ ;
114
129
}
115
- } ;
116
130
117
- const onComplete = ( task : TaskExecutor < ItemInteractionAction > ) : void => {
118
- task . actor . stopAnimation ( ) ;
131
+ // Reset the properties, and strap in for the next batch.
132
+ if ( forgedAmount === wantedAmount ) {
133
+ forgedAmount = 0 ;
134
+ wantedAmount = 0 ;
135
+ return false ;
136
+ }
119
137
} ;
120
138
121
- const hasIngredients = ( player : Player , smithable : Smithable ) => {
139
+ /**
140
+ * Checks if the player has enough materials
141
+ * @param player
142
+ * @param smithable
143
+ */
144
+ const hasMaterials = ( player : Player , smithable : Smithable ) => {
122
145
return smithable . ingredient . amount <= player . inventory . findAll ( smithable . ingredient . itemId ) . length ;
123
146
} ;
124
147
148
+ /**
149
+ * Opens the forging interface, and loads the items.
150
+ * @param details
151
+ */
125
152
const openForgingInterface : itemOnObjectActionHandler = ( details ) => {
126
- const { player, item } = details ;
153
+ const { player, item, object } = details ;
127
154
const amountInInventory = player . inventory . findAll ( item ) . length ;
128
155
156
+ player . face ( new Position ( object . x , object . y ) ) ;
157
+
129
158
// The player does not have a hammer.
130
159
if ( ! player . inventory . has ( itemIds . hammer ) ) {
131
160
player . sendMessage ( `You need a hammer to work the metal with.` , true ) ;
@@ -163,6 +192,7 @@ export default {
163
192
itemIds : [ ...bars . keys ( ) ] ,
164
193
objectIds : anvilIds ,
165
194
walkTo : true ,
195
+
166
196
cancelOtherActions : true ,
167
197
handler : openForgingInterface
168
198
} as ItemOnObjectActionHook ,
@@ -174,7 +204,6 @@ export default {
174
204
task : {
175
205
canActivate,
176
206
activate,
177
- onComplete,
178
207
interval : 1
179
208
}
180
209
} as ItemInteractionActionHook
0 commit comments