7
7
import cat .nyaa .HamsterEcoHelper .utils .database .tables .quest .QuestEntry ;
8
8
import cat .nyaa .HamsterEcoHelper .utils .database .tables .quest .QuestInstance ;
9
9
import cat .nyaa .HamsterEcoHelper .utils .database .tables .quest .QuestStation ;
10
- import cat .nyaa .nyaacore .database .BaseDatabase ;
11
10
import cat .nyaa .nyaacore .utils .InventoryUtils ;
12
- import net .milkbowl .vault .item .Items ;
13
11
import org .bukkit .Bukkit ;
14
12
import org .bukkit .Location ;
13
+ import org .bukkit .OfflinePlayer ;
15
14
import org .bukkit .entity .Player ;
16
- import org .bukkit .inventory .Inventory ;
17
15
import org .bukkit .inventory .ItemStack ;
18
16
19
17
import java .time .ZonedDateTime ;
20
- import java .util .ArrayList ;
21
18
import java .util .List ;
22
19
import java .util .UUID ;
23
20
@@ -76,7 +73,7 @@ public static void claimQuest(Player player, String questId) {
76
73
throw new RuntimeException ("user.quest.menu.reject_unfinished" );
77
74
}
78
75
79
- if (!quest .claimable ) throw new RuntimeException ("user.quest.menu.reject_unavailable" );
76
+ if (!quest .claimable || quest . masked ) throw new RuntimeException ("user.quest.menu.reject_unavailable" );
80
77
if (quest .isExpired ()) throw new RuntimeException ("user.quest.menu.reject_expired" );
81
78
// TODO prereq etc.
82
79
@@ -88,13 +85,15 @@ public static void claimQuest(Player player, String questId) {
88
85
q .status = IN_PROGRESS ;
89
86
q .startTime = ZonedDateTime .now ();
90
87
91
- quest .claimable = false ;
92
-
93
- db .query (QuestEntry .class ).whereEq ("id" , questId ).update (quest , "claimable" );
88
+ if (!quest .isRecurrentQuest ) {
89
+ quest .claimable = false ;
90
+ db .query (QuestEntry .class ).whereEq ("id" , questId ).update (quest , "claimable" );
91
+ }
94
92
db .query (QuestInstance .class ).insert (q );
95
93
}
96
94
}
97
95
96
+ /* Check the database for all in-progress quest of this player and submit them */
98
97
public static void submitQuest (Player player ) {
99
98
String playerId = player .getUniqueId ().toString ();
100
99
Database db = HamsterEcoHelper .instance .database ;
@@ -104,112 +103,126 @@ public static void submitQuest(Player player) {
104
103
.select ();
105
104
for (QuestInstance q : quests ) {
106
105
String questId = q .questId ;
107
- QuestEntry e = selectUniqueUnchecked (db .query (QuestEntry .class ).whereEq ("id" , questId ));
108
- // TODO reset quest claimable
106
+ QuestEntry e = db .query (QuestEntry .class ).whereEq ("id" , questId ).selectUniqueUnchecked ();
109
107
if (e == null ) {
110
108
player .sendMessage (I18n .format ("user.quest.submit.no_entry" , questId ));
111
- q .status = CANCELLED ;
112
- db .query (QuestInstance .class ).update (q , "status" );
109
+ q .status = INVALID ;
110
+ q .endTime = ZonedDateTime .now ();
111
+ db .query (QuestInstance .class ).whereEq ("id" , q .id ).update (q , "status" , "end_time" );
113
112
continue ;
114
113
}
115
114
115
+ player .sendMessage (I18n .format ("user.quest.submit.submitting" , e .questName ));
116
+
116
117
if (!e .completedInTime (q .startTime )) {
117
118
player .sendMessage (I18n .format ("user.quest.submit.timeout" ));
118
119
q .status = TIMEOUT ;
119
- db .query (QuestInstance .class ).update (q , "status" );
120
+ q .endTime = ZonedDateTime .now ();
121
+ if (!e .isRecurrentQuest && !e .isExpired ()) {
122
+ e .claimable = true ;
123
+ db .query (QuestEntry .class ).whereEq ("id" , e .id ).update (e , "claimable" );
124
+ }
125
+ db .query (QuestInstance .class ).whereEq ("id" , q .id ).update (q , "status" , "end_time" );
120
126
continue ;
121
127
}
122
128
123
129
if (e .targetType == QuestEntry .QuestType .OTHER ) {
124
130
player .sendMessage (I18n .format ("user.quest.submit.need_verification" ));
131
+ UUID publisherId = UUID .fromString (e .publisher );
132
+ if (Bukkit .getPlayer (publisherId ) != null ) Bukkit .getPlayer (publisherId ).sendMessage (
133
+ I18n .format ("user.quest.quest_need_verify" , player .getName (), e .questName ));
125
134
q .status = UNVERIFIED ;
126
- db .query (QuestInstance .class ).update (q , "status" );
135
+ q .endTime = ZonedDateTime .now ();
136
+ db .query (QuestInstance .class ).whereEq ("id" , q .id ).update (q , "status" , "end_time" );
127
137
} else if (e .targetType == QuestEntry .QuestType .ITEM ) {
128
- List <ItemStack > ret = withdrawInventoryAtomic (player .getInventory (), e .targetItems );
138
+ List <ItemStack > ret = InventoryUtils . withdrawInventoryAtomic (player .getInventory (), e .targetItems );
129
139
if (ret == null ) {
130
- // TODO return target item to publisher notification.
131
- //for (ItemStack item : e.targetItems) Utils.giveItem(Bukkit.getOfflinePlayer(UUID.fromString(e.publisher)), item);
140
+ UUID publisherId = UUID .fromString (e .publisher );
141
+ for (ItemStack item : e .targetItems ) Utils .giveItem (Bukkit .getOfflinePlayer (publisherId ), item );
142
+ msgIfOnline (e .publisher , "user.quest.quest_complete_by" );
132
143
switch (e .rewardType ) {
133
144
case ITEM : for (ItemStack i : e .rewardItem ) Utils .giveItem (player , i ); break ;
134
145
case MONEY : HamsterEcoHelper .instance .eco .deposit (player , e .rewardMoney ); break ;
135
146
default : break ;
136
147
}
137
148
q .status = COMPLETED ;
138
- // TODO update endTime
139
- db .query (QuestInstance .class ).update (q , "status" );
149
+ q . endTime = ZonedDateTime . now ();
150
+ db .query (QuestInstance .class ).whereEq ( "id" , q . id ). update (q , "status" , "end_time " );
140
151
player .sendMessage (I18n .format ("user.quest.submit.quest_complete" , e .id ));
141
152
} else {
142
153
player .sendMessage (I18n .format ("user.quest.submit.target_not_satisfy" , e .id ));
143
154
}
144
155
} else {
145
156
player .sendMessage (I18n .format ("user.quest.submit.bad_target_type" , e .id ));
146
- q .status = CANCELLED ;
147
- db .query (QuestInstance .class ).update (q , "status" );
157
+ q .status = INVALID ;
158
+ q .endTime = ZonedDateTime .now ();
159
+ db .query (QuestInstance .class ).whereEq ("id" , q .id ).update (q , "status" , "end_time" );
148
160
}
149
-
150
-
151
-
152
161
}
153
162
}
154
163
155
- // TODO move to NC
156
- private static <T > T selectUniqueUnchecked (BaseDatabase .Query <T > q ) {
157
- try {
158
- return q .selectUnique ();
159
- } catch (RuntimeException ex ) {
160
- return null ;
164
+ public static void confirmQuest (String questInstanceId , boolean confirmed ) {
165
+ Database db = HamsterEcoHelper .instance .database ;
166
+ QuestInstance questInstance = db .query (QuestInstance .class ).whereEq ("id" , questInstanceId ).selectUnique ();
167
+ if (questInstance .status != UNVERIFIED ) throw new IllegalArgumentException ("quest status incorrect, expecting UNVERIFIED: " + questInstanceId );
168
+ QuestEntry questEntry = db .query (QuestEntry .class ).whereEq ("id" , questInstance .questId ).selectUnique ();
169
+ UUID claimerId = UUID .fromString (questInstance .claimer );
170
+ if (!confirmed ) {
171
+ msgIfOnline (claimerId , "user.quest.rejected" , questEntry .questName );
172
+ questInstance .status = QuestInstance .QuestStatus .REJECTED ;
173
+ db .query (QuestInstance .class ).whereEq ("id" , questInstanceId ).update (questInstance , "status" );
174
+ if (!questEntry .isRecurrentQuest && !questEntry .isExpired ()) {
175
+ questEntry .claimable = true ;
176
+ db .query (QuestEntry .class ).whereEq ("id" , questEntry .id ).update (questEntry , "claimable" );
177
+ }
178
+ } else {
179
+ OfflinePlayer claimer = Bukkit .getOfflinePlayer (claimerId );
180
+ switch (questEntry .rewardType ) {
181
+ case ITEM : for (ItemStack i : questEntry .rewardItem ) Utils .giveItem (claimer , i ); break ;
182
+ case MONEY : HamsterEcoHelper .instance .eco .deposit (claimer , questEntry .rewardMoney ); break ;
183
+ default : break ;
184
+ }
185
+ questInstance .status = COMPLETED ;
186
+ db .query (QuestInstance .class ).whereEq ("id" , questInstanceId ).update (questInstance , "status" );
187
+ msgIfOnline (claimerId , "user.quest.verified" , questEntry .questName );
161
188
}
162
189
}
163
190
164
- /**
165
- * Remove items from inventory.
166
- * Either all removed or none removed.
167
- * @param inv the inventory
168
- * @param itemToBeTaken items to be removed
169
- * @return If null, then all designated items are removed. If not null, it contains the items missing
170
- * TODO move to NC
171
- */
172
- private static List < ItemStack > withdrawInventoryAtomic ( Inventory inv , List < ItemStack > itemToBeTaken ) {
173
- ItemStack [] itemStacks = inv . getContents ( );
174
- ItemStack [] cloneStacks = new ItemStack [ itemStacks . length ];
175
- for ( int i = 0 ; i < itemStacks . length ; i ++) {
176
- cloneStacks [ i ] = itemStacks [ i ] == null ? null : itemStacks [ i ]. clone ( );
191
+ public static void cancelQuest ( String questInstanceId ) {
192
+ Database db = HamsterEcoHelper . instance . database ;
193
+ QuestInstance questInstance = db . query ( QuestInstance . class ). whereEq ( "id" , questInstanceId ). selectUnique ();
194
+ if ( questInstance . status != IN_PROGRESS && questInstance . status != UNVERIFIED )
195
+ throw new IllegalArgumentException ( "quest status incorrect, expecting IN_PROGRESS or UNVERIFIED: " + questInstanceId );
196
+ QuestEntry questEntry = db . query ( QuestEntry . class ). whereEq ( "id" , questInstance . questId ). selectUnique ();
197
+ msgIfOnline ( questInstance . claimer , "user.quest.cancelled" , questEntry . questName );
198
+ questInstance . status = QuestInstance . QuestStatus . CANCELLED ;
199
+ questInstance . endTime = ZonedDateTime . now ();
200
+ db . query ( QuestInstance . class ). whereEq ( "id" , questInstance . id ). update ( questInstance , "status" , "end_time" );
201
+ if (! questEntry . isRecurrentQuest && ! questEntry . isExpired ()) {
202
+ questEntry . claimable = true ;
203
+ db . query ( QuestEntry . class ). whereEq ( "id" , questEntry . id ). update ( questEntry , "claimable" );
177
204
}
205
+ }
178
206
179
- List <ItemStack > ret = new ArrayList <>();
180
-
181
- for (ItemStack item : itemToBeTaken ) {
182
- int sizeReq = item .getAmount ();
183
-
184
- for (int i = 0 ; i < cloneStacks .length ;i ++) {
185
- if (cloneStacks [i ] == null ) continue ;
186
- if (cloneStacks [i ].isSimilar (item )) {
187
- int sizeSupp = cloneStacks [i ].getAmount ();
188
- if (sizeSupp > sizeReq ) {
189
- cloneStacks [i ].setAmount (sizeSupp - sizeReq );
190
- sizeReq = 0 ;
191
- break ;
192
- } else {
193
- cloneStacks [i ] = null ;
194
- sizeReq -= sizeSupp ;
195
- if (sizeReq == 0 ) break ;
196
- }
197
- }
198
- }
207
+ public static void withdrawQuest (String questEntryId ) {
208
+ Database db = HamsterEcoHelper .instance .database ;
209
+ QuestEntry questEntry = db .query (QuestEntry .class ).whereEq ("id" , questEntryId ).selectUnique ();
210
+ for (QuestInstance qi : db .query (QuestInstance .class ).whereEq ("questId" , questEntryId ).select ())
211
+ if (qi .status == IN_PROGRESS || qi .status == UNVERIFIED )
212
+ cancelQuest (qi .id );
213
+ questEntry .masked = true ;
214
+ db .query (QuestEntry .class ).whereEq ("id" , questEntryId ).update (questEntry , "masked" );
215
+ msgIfOnline (questEntry .publisher , "user.quest.withdrawn" , questEntry .questName );
216
+ }
199
217
200
- if (sizeReq > 0 ) {
201
- ItemStack n = item .clone ();
202
- item .setAmount (sizeReq );
203
- ret .add (n );
204
- }
205
- }
218
+ private static void msgIfOnline (String id , String template , Object ... objs ) {;
219
+ UUID uid = UUID .fromString (id );
220
+ msgIfOnline (uid , template , objs );
221
+ }
206
222
207
- if (ret .size () == 0 ) {
208
- inv .setContents (cloneStacks );
209
- return null ;
210
- } else {
211
- return ret ;
223
+ private static void msgIfOnline (UUID uid , String template , Object ... objs ) {
224
+ if (Bukkit .getPlayer (uid ) != null ) {
225
+ Bukkit .getPlayer (uid ).sendMessage (I18n .format (template , objs ));
212
226
}
213
227
}
214
-
215
228
}
0 commit comments