From e12674d2adfd79b2fe96db812264dd1573793819 Mon Sep 17 00:00:00 2001 From: Blackvein Date: Sat, 29 Jun 2013 23:36:53 -0700 Subject: [PATCH] 1.6.4 Update --- .DS_Store | Bin 6148 -> 6148 bytes build/built-jar.properties | 2 +- build/classes/config.yml | 14 +- build/classes/me/blackvein/quests/Event.class | Bin 17493 -> 17962 bytes .../EventFactory$CreateMenuPrompt.class | Bin 10763 -> 11654 bytes .../quests/EventFactory$DeletePrompt.class | Bin 2210 -> 2350 bytes .../EventFactory$EffectListPrompt.class | Bin 4856 -> 5031 bytes .../EventFactory$EffectLocationPrompt.class | Bin 3250 -> 3311 bytes .../quests/EventFactory$EffectPrompt.class | Bin 4001 -> 4041 bytes .../quests/EventFactory$EventNamePrompt.class | Bin 3298 -> 3362 bytes .../quests/EventFactory$ExplosionPrompt.class | Bin 3348 -> 3365 bytes .../quests/EventFactory$FinishPrompt.class | Bin 3911 -> 3887 bytes .../quests/EventFactory$HealthPrompt.class | Bin 2245 -> 2367 bytes .../quests/EventFactory$HungerPrompt.class | Bin 2245 -> 2367 bytes .../quests/EventFactory$ItemListPrompt.class | Bin 4787 -> 4043 bytes .../quests/EventFactory$LightningPrompt.class | Bin 3359 -> 3371 bytes .../quests/EventFactory$MenuPrompt.class | Bin 3200 -> 3931 bytes .../quests/EventFactory$MessagePrompt.class | Bin 1999 -> 2104 bytes .../EventFactory$MobAmountsPrompt.class | Bin 3150 -> 3254 bytes .../EventFactory$MobLocationPrompt.class | Bin 3232 -> 3279 bytes .../quests/EventFactory$MobPrompt.class | Bin 5575 -> 5718 bytes .../quests/EventFactory$MobTypesPrompt.class | Bin 4360 -> 4467 bytes .../EventFactory$PotionDurationsPrompt.class | Bin 3261 -> 3327 bytes .../EventFactory$PotionEffectPrompt.class | Bin 5776 -> 5808 bytes .../EventFactory$PotionMagnitudesPrompt.class | Bin 3200 -> 3304 bytes .../EventFactory$PotionTypesPrompt.class | Bin 3534 -> 3650 bytes .../EventFactory$QuestCreatorPrefix.class | Bin 1069 -> 1069 bytes .../quests/EventFactory$QuitPrompt.class | Bin 2338 -> 2480 bytes .../EventFactory$SaturationPrompt.class | Bin 2269 -> 2391 bytes .../EventFactory$SelectDeletePrompt.class | Bin 4180 -> 4273 bytes .../EventFactory$SelectEditPrompt.class | Bin 3257 -> 3409 bytes .../quests/EventFactory$SetNamePrompt.class | Bin 3225 -> 3289 bytes .../EventFactory$SetNpcStartPrompt.class | Bin 2359 -> 2478 bytes .../EventFactory$StormDurationPrompt.class | Bin 2270 -> 2374 bytes .../quests/EventFactory$StormPrompt.class | Bin 3777 -> 4071 bytes .../EventFactory$StormWorldPrompt.class | Bin 3178 -> 3292 bytes .../quests/EventFactory$TeleportPrompt.class | Bin 3005 -> 3026 bytes .../EventFactory$ThunderDurationPrompt.class | Bin 2282 -> 2381 bytes .../quests/EventFactory$ThunderPrompt.class | Bin 3801 -> 4095 bytes .../EventFactory$ThunderWorldPrompt.class | Bin 3192 -> 3281 bytes .../me/blackvein/quests/EventFactory.class | Bin 18264 -> 17952 bytes .../me/blackvein/quests/NpcListener.class | Bin 5937 -> 7359 bytes .../me/blackvein/quests/PlayerListener.class | Bin 15893 -> 15931 bytes build/classes/me/blackvein/quests/Quest.class | Bin 11154 -> 10660 bytes .../QuestFactory$AskMessagePrompt.class | Bin 1964 -> 1964 bytes .../QuestFactory$BlockStartPrompt.class | Bin 2920 -> 2920 bytes .../QuestFactory$CreateMenuPrompt.class | Bin 7123 -> 8008 bytes .../quests/QuestFactory$ExitPrompt.class | Bin 2375 -> 2410 bytes .../QuestFactory$FinishMessagePrompt.class | Bin 1979 -> 1979 bytes .../quests/QuestFactory$MenuPrompt.class | Bin 1977 -> 3287 bytes .../quests/QuestFactory$QuestNamePrompt.class | Bin 3294 -> 3362 bytes .../quests/QuestFactory$RedoDelayPrompt.class | Bin 2351 -> 2351 bytes .../quests/QuestFactory$SavePrompt.class | Bin 4288 -> 4323 bytes .../QuestFactory$SelectEditPrompt.class | Bin 2280 -> 2896 bytes .../quests/QuestFactory$SetNamePrompt.class | Bin 3321 -> 3452 bytes .../QuestFactory$SetNpcStartPrompt.class | Bin 2788 -> 2792 bytes .../me/blackvein/quests/QuestFactory.class | Bin 14142 -> 24476 bytes .../classes/me/blackvein/quests/Quester.class | Bin 56236 -> 57119 bytes .../me/blackvein/quests/Quests$1.class | Bin 1497 -> 1497 bytes .../me/blackvein/quests/Quests$2.class | Bin 913 -> 3042 bytes .../blackvein/quests/Quests$QuestPrompt.class | Bin 2526 -> 2535 bytes .../quests/Quests$QuestsPrefix.class | Bin 1316 -> 1290 bytes .../classes/me/blackvein/quests/Quests.class | Bin 93887 -> 97214 bytes build/classes/me/blackvein/quests/Stage.class | Bin 4774 -> 4863 bytes ...eStagePrompt$BreakBlockAmountsPrompt.class | Bin 3420 -> 3455 bytes ...reateStagePrompt$BreakBlockIdsPrompt.class | Bin 3599 -> 3634 bytes ...eateStagePrompt$BreakBlockListPrompt.class | Bin 5653 -> 5688 bytes ...ateStagePrompt$CutBlockAmountsPrompt.class | Bin 3406 -> 3441 bytes .../CreateStagePrompt$CutBlockIdsPrompt.class | Bin 3587 -> 3622 bytes ...CreateStagePrompt$CutBlockListPrompt.class | Bin 5623 -> 5658 bytes ...StagePrompt$DamageBlockAmountsPrompt.class | Bin 3427 -> 3462 bytes ...eateStagePrompt$DamageBlockIdsPrompt.class | Bin 3605 -> 3640 bytes ...ateStagePrompt$DamageBlockListPrompt.class | Bin 5668 -> 5703 bytes ...CreateStagePrompt$DelayMessagePrompt.class | Bin 2932 -> 2967 bytes .../CreateStagePrompt$DelayPrompt.class | Bin 3365 -> 3400 bytes .../CreateStagePrompt$DeletePrompt.class | Bin 3382 -> 3417 bytes ...CreateStagePrompt$DeliveryListPrompt.class | Bin 7950 -> 7868 bytes ...teStagePrompt$DeliveryMessagesPrompt.class | Bin 2929 -> 2964 bytes ...CreateStagePrompt$DeliveryNPCsPrompt.class | Bin 3808 -> 3843 bytes .../CreateStagePrompt$DenizenPrompt.class | Bin 3774 -> 3809 bytes ...eateStagePrompt$EnchantAmountsPrompt.class | Bin 3417 -> 3452 bytes ...CreateStagePrompt$EnchantItemsPrompt.class | Bin 3598 -> 3633 bytes ...CreateStagePrompt$EnchantTypesPrompt.class | Bin 4515 -> 4278 bytes ...ateStagePrompt$EnchantmentListPrompt.class | Bin 6823 -> 6858 bytes .../CreateStagePrompt$EventPrompt.class | Bin 3952 -> 3987 bytes .../CreateStagePrompt$FishPrompt.class | Bin 2956 -> 2991 bytes .../CreateStagePrompt$KillPlayerPrompt.class | Bin 2983 -> 3018 bytes .../CreateStagePrompt$MobAmountsPrompt.class | Bin 3393 -> 3428 bytes .../CreateStagePrompt$MobListPrompt.class | Bin 9143 -> 9178 bytes ...teStagePrompt$MobLocationNamesPrompt.class | Bin 2750 -> 2785 bytes .../CreateStagePrompt$MobLocationPrompt.class | Bin 3688 -> 3723 bytes .../CreateStagePrompt$MobRadiiPrompt.class | Bin 3429 -> 3464 bytes .../CreateStagePrompt$MobTypesPrompt.class | Bin 4605 -> 4640 bytes ...teStagePrompt$NPCAmountsToKillPrompt.class | Bin 3365 -> 3449 bytes ...CreateStagePrompt$NPCIDsToKillPrompt.class | Bin 3806 -> 3841 bytes ...eateStagePrompt$NPCIDsToTalkToPrompt.class | Bin 4112 -> 4147 bytes .../CreateStagePrompt$NPCKillListPrompt.class | Bin 5818 -> 5912 bytes ...eStagePrompt$PlaceBlockAmountsPrompt.class | Bin 3420 -> 3455 bytes ...reateStagePrompt$PlaceBlockIdsPrompt.class | Bin 3599 -> 3634 bytes ...eateStagePrompt$PlaceBlockListPrompt.class | Bin 5653 -> 5688 bytes .../CreateStagePrompt$ReachListPrompt.class | Bin 6785 -> 6820 bytes ...reateStagePrompt$ReachLocationPrompt.class | Bin 3701 -> 3736 bytes .../CreateStagePrompt$ReachNamesPrompt.class | Bin 2737 -> 2772 bytes .../CreateStagePrompt$ReachRadiiPrompt.class | Bin 3441 -> 3476 bytes ...CreateStagePrompt$ShearAmountsPrompt.class | Bin 3407 -> 3442 bytes .../CreateStagePrompt$ShearColorsPrompt.class | Bin 4030 -> 4065 bytes .../CreateStagePrompt$ShearListPrompt.class | Bin 5615 -> 5650 bytes .../CreateStagePrompt$TameAmountsPrompt.class | Bin 3413 -> 3448 bytes .../CreateStagePrompt$TameListPrompt.class | Bin 5588 -> 5623 bytes .../CreateStagePrompt$TameTypesPrompt.class | Bin 4622 -> 4657 bytes ...ateStagePrompt$UseBlockAmountsPrompt.class | Bin 3406 -> 3441 bytes .../CreateStagePrompt$UseBlockIdsPrompt.class | Bin 3587 -> 3622 bytes ...CreateStagePrompt$UseBlockListPrompt.class | Bin 5623 -> 5658 bytes .../quests/prompts/CreateStagePrompt.class | Bin 21449 -> 22197 bytes ...RequirementsPrompt$FailMessagePrompt.class | Bin 2202 -> 2237 bytes .../RequirementsPrompt$ItemListPrompt.class | Bin 6094 -> 5762 bytes .../RequirementsPrompt$MoneyPrompt.class | Bin 2920 -> 2955 bytes ...RequirementsPrompt$PermissionsPrompt.class | Bin 2759 -> 2794 bytes ...RequirementsPrompt$QuestListPrompt$1.class | Bin 1202 -> 1202 bytes .../RequirementsPrompt$QuestListPrompt.class | Bin 4419 -> 4454 bytes ...RequirementsPrompt$QuestPointsPrompt.class | Bin 2626 -> 2661 bytes ...RequirementsPrompt$RemoveItemsPrompt.class | Bin 3185 -> 3220 bytes .../quests/prompts/RequirementsPrompt.class | Bin 7762 -> 6216 bytes .../RewardsPrompt$CommandsPrompt.class | Bin 3186 -> 3221 bytes .../RewardsPrompt$ExperiencePrompt.class | Bin 2502 -> 2537 bytes .../RewardsPrompt$ItemListPrompt.class | Bin 4988 -> 4341 bytes .../prompts/RewardsPrompt$MoneyPrompt.class | Bin 2808 -> 2843 bytes .../RewardsPrompt$PermissionsPrompt.class | Bin 2704 -> 2739 bytes .../RewardsPrompt$QuestPointsPrompt.class | Bin 2517 -> 2552 bytes .../RewardsPrompt$mcMMOAmountsPrompt.class | Bin 3238 -> 3275 bytes .../RewardsPrompt$mcMMOListPrompt.class | Bin 5008 -> 5020 bytes .../RewardsPrompt$mcMMOSkillsPrompt.class | Bin 3452 -> 3781 bytes .../quests/prompts/RewardsPrompt.class | Bin 7673 -> 6436 bytes .../quests/prompts/StagesPrompt.class | Bin 7815 -> 7176 bytes .../me/blackvein/quests/stageDataNames.txt | 13 +- build/classes/plugin.yml | 27 +- build/classes/quests.yml | 10 +- nbproject/.DS_Store | Bin 6148 -> 6148 bytes nbproject/private/private.properties | 2 +- nbproject/project.properties | 8 +- src/.DS_Store | Bin 6148 -> 6148 bytes src/config.yml | 18 +- src/me/blackvein/quests/ColorUtil.java | 31 + src/me/blackvein/quests/EpicBossListener.java | 32 + src/me/blackvein/quests/Event.java | 359 +++-- src/me/blackvein/quests/EventFactory.java | 843 +++++------ src/me/blackvein/quests/NpcEffectThread.java | 4 - src/me/blackvein/quests/NpcListener.java | 174 ++- src/me/blackvein/quests/PacketUtils.java | 30 + src/me/blackvein/quests/ParticleEffect.java | 23 +- src/me/blackvein/quests/Party.java | 218 +++ src/me/blackvein/quests/PlayerListener.java | 3 +- src/me/blackvein/quests/Quest.java | 110 +- src/me/blackvein/quests/QuestFactory.java | 935 ++++++++++-- src/me/blackvein/quests/Quester.java | 473 +++--- src/me/blackvein/quests/Quests.java | 1317 +++++++++++------ src/me/blackvein/quests/Stage.java | 20 +- src/me/blackvein/quests/languages | 12 + src/me/blackvein/quests/notes | 5 + src/me/blackvein/quests/objective names | 16 + .../quests/prompts/CreateStagePrompt.java | 823 ++++++---- .../quests/prompts/ItemStackPrompt.java | 548 +++++++ .../quests/prompts/QuestAcceptPrompt.java | 150 ++ .../quests/prompts/RequirementsPrompt.java | 252 +--- .../quests/prompts/RewardsPrompt.java | 504 +++---- .../quests/prompts/StagesPrompt.java | 31 +- src/me/blackvein/quests/rules | 8 + src/me/blackvein/quests/stageDataNames.txt | 10 + src/me/blackvein/quests/util/ItemUtil.java | 193 +++ src/me/blackvein/quests/util/Lang.java | 244 +++ .../blackvein/quests/util/ReflectionUtil.java | 19 + src/plugin.yml | 33 +- src/quests.yml | 12 +- 173 files changed, 5087 insertions(+), 2439 deletions(-) create mode 100644 src/me/blackvein/quests/ColorUtil.java create mode 100644 src/me/blackvein/quests/EpicBossListener.java create mode 100644 src/me/blackvein/quests/PacketUtils.java create mode 100644 src/me/blackvein/quests/Party.java create mode 100644 src/me/blackvein/quests/languages create mode 100644 src/me/blackvein/quests/notes create mode 100644 src/me/blackvein/quests/objective names create mode 100644 src/me/blackvein/quests/prompts/ItemStackPrompt.java create mode 100644 src/me/blackvein/quests/prompts/QuestAcceptPrompt.java create mode 100644 src/me/blackvein/quests/rules create mode 100644 src/me/blackvein/quests/util/ItemUtil.java create mode 100644 src/me/blackvein/quests/util/Lang.java create mode 100644 src/me/blackvein/quests/util/ReflectionUtil.java diff --git a/.DS_Store b/.DS_Store index b99eebb801746cc1efe9d2cdad0c6e4446a748e5..aecc12c9ec2197091a2574b831e79260dd81ebd3 100644 GIT binary patch delta 551 zcmZoMXfc@JFD%5sz`)4BAi%(ol9O&2oSdIquvw5}C38JUf|VhOp_Cz$AqOD|6lGxG z^|D8m&CPdlNhvK!W?(pbY57F38YI2B`6+m03o;sB~Ux-3&08( zL+$}-EXt4^a5muwF2j&~jz<-;!x$JBfDB`1V<-l?DtWR5OA&{KsfCV$iJ{Ttd{(z) uurPAKFmRur1=0c0fW=*K8F;|J+ya$Bv7a}9VR8+7_r!+No7p-3@&f?AXM^kj delta 257 zcmZoMXfc@JFUrBdz`)4BAi$7RUR;orlb;0Suiq@lv7DI~B*nsz!jQ>O%uq79kF|)y z$k0?r!Nk~dG6$QBJY1?QxF|0tKQA3(5(6_s4p2)HSc9dZxsHO7g(*;jn;=*iS@GmJ zRxutVd)G~##hT11UR`ZyWTB&AHkqAGmbJR3wyu7%CYwBCBS^UtvVNe2%s{slF(jiK d!UZ(M$UsNI(A)%QwG4_W8`-)yvvd6A2LMN@Kz0BC diff --git a/build/built-jar.properties b/build/built-jar.properties index 1e31d4ba6..00280279b 100644 --- a/build/built-jar.properties +++ b/build/built-jar.properties @@ -1,4 +1,4 @@ -#Mon, 22 Apr 2013 13:58:51 -0700 +#Fri, 07 Jun 2013 13:23:55 -0700 /Users/136-aclarke/Desktop/Quests= diff --git a/build/classes/config.yml b/build/classes/config.yml index a88b0384a..da73fb4d9 100644 --- a/build/classes/config.yml +++ b/build/classes/config.yml @@ -16,24 +16,20 @@ # debug-mode: true/false # Should debugging information be printed out to console? # -# kill-delay: number +# kill-time: number # How long (in seconds) should a player have to wait before they can kill the same player for a Quest? -# -# prompt-timeout: number -# How long (in seconds) should a player be prompted for a Quest before it auto-cancels? (0 = Infinite) allow-command-questing: true allow-command-quests-with-npcs: false show-requirements: true allow-quitting: true debug-mode: false kill-delay: 600 +accept-timeout: 20 snoop: true -prompt-timeout: 20 +show-npc-effects: true +npc-effect: "note" quester-blacklist: - "SomeGuy12345" - "somePrefix*" - "*someSuffix" - - "*someRegex*" - - - + - "*someRegex*" \ No newline at end of file diff --git a/build/classes/me/blackvein/quests/Event.class b/build/classes/me/blackvein/quests/Event.class index b01f0dd37f3e1f9485c9726894d1e40a29aabd86..cd7bea039224b4dcadc50c67788dc813f5918fae 100644 GIT binary patch literal 17962 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 literal 17493 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 diff --git a/build/classes/me/blackvein/quests/EventFactory$CreateMenuPrompt.class b/build/classes/me/blackvein/quests/EventFactory$CreateMenuPrompt.class index 8b994678ded968a0f8da8d83516f63a16bba94d2..4a787baa0379f4ea28e5a1327674d70cd3212a6a 100644 GIT binary patch literal 11654 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 literal 10763 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 diff --git a/build/classes/me/blackvein/quests/EventFactory$DeletePrompt.class b/build/classes/me/blackvein/quests/EventFactory$DeletePrompt.class index d570c0c47ef009ee5146e82ff2fbf72caddc02f2..d3d230c1de23d10b54e75f3e93bc6e6280ffcb18 100644 GIT binary patch delta 942 zcmZ9LSx*yD6o9`wEuCQ;q?T&2f>dyYVsT&Uh7@-cL{z{HWvtcO8mt(f`rschnJ3?j zK5JaTNMcNUF~m1fx1AVbCUehn&pG$I=j1+K^ej@I{qycUu#tjIoE^2Y z?6g@%+GLkakaR7(*`u|+7W-_v*{_Wri;UjswK!mNkV7ViEsp4|quPJWqR-;E#R;2w z`fUa{X)00i^-9|&5@g5jY>Xy^u&_uJta?X1D0!`&%hY>~{&T(E5 zb0^(GsdqeADo$kFyjybnCyF<3l}s);T;!4t8&epGR)@=sDy(rg->Y*>t~iY2D#F*t zCdX3wu|hUASenQcvWh_KUfba+S%+&nD{#-ftxzecR9`4MnN7T&njC{i_s` oi8f2Lp57L=%5@F4RXVnvRU+ep7?-!QQv4f461L>U3~&nLFZ)rKfB*mh delta 888 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 AMF0Q* literal 4856 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 ASpWb4 diff --git a/build/classes/me/blackvein/quests/EventFactory$EffectPrompt.class b/build/classes/me/blackvein/quests/EventFactory$EffectPrompt.class index 07fd83da8f600fd9a890a5c0d5af9ff29cf4ecfe..f0a1d572de4f6a5a454627d43f28043d283e92e1 100644 GIT binary patch literal 4041 zcmb7HYkM145q^&>@2=MyR}ra`7?O(Asc*4Wn*@p-46(eng=NdN?5HtNcO`A)jU}zJ zyK?PtE%#fm6bj`|OG}|Z5)wP9X$iN$!!O_yzk`RT6z1&8sieq{(l5Jn=FB^1&YXAV z?Ed4e*WLgygulxe#v?8C&}57tB_b`uk5mgX(7AM0LYBW*_`~4pa}rkhJ0~G8p&-LV zQNno%mIPaZBcUW=O~RuR)+KC6xFF$^5KjC>YKt!_n@><~^qw{1G#wGu#z33i@m*pVF-bEtMlpFlMH;+-c1+__(a}^I#Yh z_3T+a?aWzbzUa^}S}5pNB&XT7PP5^LD|c4nDe660z3gm3UnhrS-7(Y3hEt{0Rl^CV z&BB^)*_vaR1v?z67?JD{V5BE@PFvH$IjxWlCmhQtWXY*WI6liT@XovuRCo7BdkNO_ z+^VJ1deMm%iY4-%euu%{?y+b0_`DR;ZrVLq$uV+aI;&MZ6EkdwCYlW|4566QHgt=j zqtY9Z!*DjjbMBn$rs`BTiaRIUTi5@|+k+h?FMARW(Qrm9y0jqb6TwCNgaHiEJ0MIFvtnBWTo{9gEM$>JQ0W`Lcpv;1vbG#EZoLvDm34bvZE=k1vE2{EF** z{UO2;kH&J^1wFB1nvRH975o~%VPG;t%UC?QJQ1B&$xh~W=A#paMPZAPSTr&{Na_|+ zM{-7bl@j1-hbpy0wDNd7KEJ#WpPY3k-l71DZ6#P1Yb!BqvDctymPf@`?WGrZ=gUQsJ}4ciR++@r6lCk4O9>k8h$ zA4J?x@JIYf#Ge)Xg#!i~wcm1A<8`^y83W#$l`2LI`77V$0iCyQHDgfgjuzImoRRUY z72L$%82ayUy`8m=R-~u8WqK`f$L>f&zeKmDZeD+f>X}B&oM|mmAEL`+E;>8SdsD^I zkrmBxO{h-@TCu1XhynfG6^$gGI!BjBou*wbJ_1(Rmpl6HP5y0r$uT`EI@j*o4S6VY zi}Q0am13TpKXqo8t$A#qTZ9roR}#a0m2vMH2X}u)jm6?ghGP|}s6GX{tZrRnBzsqr zOv_A|R&vG6Gjvnv4dHYd(|Up0#ziXqd`ZjM(QLuA^oV9t{oh?L{3YrOj=4xDV|i8` z^-lRg_w#}(ivsj$$?QTKW9_?^Xm4XOh>3MUF za^5trj#Gwh;{6O|K+EoS4yO^KPuCIplx2YczmrJv!^f{EFnokY$7$rFx7^!z6~5jr zG+m;R52xrUkPVvujWLoHE<;8H6ZB@7#FXd3_cU2I5u|Gy{xe%>z6@a#Vo=&d%O>QR zvi2AaFQb*uD6Y7Ni)|zZ@4AKnfA6J7eMGPZ@ver5eKm-?8zS0k5c?Y<4%8qHHbivP zAl}^&@tzvQp@xXVHHdo}B0@EY_clZvsX^RZA8{F-bjbYVgGW6JI^K&!ACF!`L@G4@ z7wye&VXFCmxF7(p3Jm`ed@LX|u`$8V9HE)LBna%Eg6NZl7MF@4k8Wiu67dklM~RH> zzP*@6jJz|u-NgM#GC1hp#9;3g_^x26|2p31LvkC(&v4BaPF(D-sswlc z?{_oy0nYgcZl&TnKIp?XhRZ;9ad(%r0l!<5!)T+z3_ucs*eC46VPQYIgabGsbYN6C zgel=L=7f9jun@vI;a)r^bm9e}2bY9iH+iE})kBn$X~fCnD2|mSO3+S1N%9iPb#rb) zC0xaWm?vC!_qqjy-o7oc z`n|?IV2ac0HM|dfj5-(ZKLS3EPml*69;T5G%TVdvL2(V!&o1}<5WNwQsINVX@4@$f Do-aKP literal 4001 zcmb7HTX!4P75D1b21u#6w^DXZqB|>gqlkIT|@u9bRV6<=gx0v-h|6 zp84m0KlulMLHs?8<9Ku*J-!vj14xH(E{q`3`=B8sMp+p-@#f;OESB>!3gWHHI4@&G zh9P5BhAG36QIv5(hAqR9;mRnF>z+ZWvGCdm(&Z#t*`H z5ZhB1IgW&BJmzAWRFCUoNG zA^akQUouE;L3cXuW#~w*@<_(evMXy`HzOBH+;N>qY>k`lxR!M-dwqz|Cv{VIhZ&A` z?GEog!w`&GInHoPQaAZ@X*I*`c`akmN^8=}YQ`DO*2TQK7!<}ZD6!>bo^@wzYqjXo zG+~5hGym?bFQtMc~Tl8IkC%d?2Bn5QC_(p-KBLW%}rW1%ZqNpES5-n z_6r(&qsH#W_IWO*+q8LNC092h6sr}UOX`kG8+&!n45?^n>)d8&_iH0^=F38CSD`{k0wW!V(GbwRBB#T@CUKh-mj7^W=^%1RZSf= zw8yx*tP5&}8TO5)7SiL1*_g_3s1BI1F4kb7XfhF<93W6jzdE934L!S}IzlVy@HPi& zla3lub2?Ghrf_eADPyVBY$rrsJm* za}y+Wmrsf=!PN{^pu9@SMX!?X6u7WRiBF8o%~##9-2?H0=D4-1HE&^O6R}A;;db8% zn(Bd_g01rv&z`oW)YNDqmX1!u7Sf5?)O1?hiv+vt1edJUjLy|;fnO8`YNo2&mZ^$+ zl7WZ(N)}S7vDkGrJ^xpYdeNdPS=FQ9k0QYF7*!Wr9N`rU)zntG>RPIn%c;66Ms9(t z24!iV@GXUg;2l}b%yOecY}?!|*=7iTQt)TIMdtZxUR~Z&S@*<3cw50ccvr!Dcq4@O z6?}ld5bODxTji&Mzv42(trcExD;5eq#1#d9!&L%sQu5^JI$gd(naZ4}=D0&ssumX#tixA3 z){RZ9hL>H-Ls4kEZUhQbW=_w}Bx7WAe0F4!=8LgpGPS_a=d-=ubJRVr_f;Buy)sO# zc-*oV3f3w^7oD}MIDH+^`7PTkDJ}5}CCzXWdDF6aRCA~#-{$wz*1eY)nq2ENxzhGf z?K?&0RONezY9|@!agX7ioz(d)_JCyGev+EwjzgaiW16cm-0c_LA!5}fA`9j7Hp92z zWcYq(o8CH;s=yt%LHs-DaD#ZlbJa|u#$5Tr5g%i<^ra?C<~P?ZP;_m+YORq&_sqt| z$bAm6aEh*{xVVA6S0I%UYL&~_S4McMy4pw6 zD`*lsN@dtAhWi_WZmEG<8iEegK&=fyU#fv_Z3w!p25M^vI#>f8Y6v=91GP5<9jSr7 z+z@no4fK_UpgU?HwH|Z@can>R-&;Gpoy!zCFS3IaPe?JeN#huj;y5Qw;3+AAccq8$ zFKH70mXhqSG{uIcX_l2z>}ly#g$1e?=_(5-<`_quc+ke4!vqqfo#7!&ddy&t6M8S5 zxzSt3U7wt7zuB4IYO0hOoaivUMeHtl}n;}cu$hn@5Q`dEf z(Jbw?BKSE5Lzw#D^9t9j9N{5n4G-Z?wqtL#yE>1pWt9AV0qV diff --git a/build/classes/me/blackvein/quests/EventFactory$EventNamePrompt.class b/build/classes/me/blackvein/quests/EventFactory$EventNamePrompt.class index c61c781dbe7eb92517e2f9b5c992751e6aa38931..a029ff569a05a74df45d1f3b3f4f842aa2947e3e 100644 GIT binary patch delta 1401 zcmZvc>sORj6vlt=JBN8^UQRhoCJkYYBvLRSDBZ{`Ly8os6fZq~z?U&_CrwffLn>8kdb8Hu&@%h{KAKhJ*Nv-dh@Lr2Qe zKmYUn55Nj0UCL?m%dx@b2HG9&b5XSWxt|A&x6#KYmku_YV2ep_^|8%Ir->i*(dF_G z5Buq6yPrphy6m8*m|kM$*y+&cXA%7_adsK>qdo?TTNxzbkTkHNVjg4I$B0Xc-9AQr zJZ`G@nEVqCdtEANb9l<7%GhTtys7^9$kKX?icHv3apLzzTcsVI&4fHh0}*O9)zoMr zJZDjw`ORA@AD`E}z&_23ykt=l8;vDWExqwna=3Xo7EQ$*Ue>(AtES*J&Fk#5@Puo_ z7NL2yEs0cYxW!=Gqk}Qce%`R~_YC$nM-x4<0f#p=2RP{Pmga3T4)18*+8J}C!3o4x1Zv{Fu zUoheDrREr4Sp?@P-IN@RB@^;nUu(YMphaNb$29{({ZR`iHd^?PZ#k~{&Tus3$WIsj zWGxnNp}#pfkR0BeiVtKCd%NK5WkL2oRQJvEioy42P3Hr|9&*Gj;Q*1&le(#4S+1H>A2M>w=9JEGwaqN$orZH7YjWb>Q+fKukr}SB zh4vEoYv=IkiwGiT2#;S1v}6u+5vC?sAzH8dzwuI=t+P}XR4tpFrK;dxZ*JC;8{ldd zkVb7ps}Aba7Mj#Hx>P5-)OPl&D2LPzCe%)jtA2h_aeh^UoK*?_P)W|Kk=!^M<$CMn z;%{fQ>`s}y9CvW18Ik3?Fe35tBQm))xe?tZB1-U{Ctc>ye2%uiu~)4O2aqw|UD%wp zGD@>K-s&2;*h}wSei^(MI>}DnBU@~C(Mv1$3WLo$iEP%hQf!52ESJY@g=E%>B^dC@ Ov(?R$lBg2

ZGDhufV delta 1364 zcmZ{k+gDUo9LGOr*vy$Z91}=I2BU*SC^IA|rl^@3XkNg|)JVGwaFi+Lj132nE==0R z?iZ#qD6KT>6^%89tkr6*p6aF5OMgJCr+VqRSk-UOOsrbVUiR<1fBSd;eb>Ga`Kdbd z-JjRK0@m`GMT9+JIrdsKvd^T;La{GQH~TfZC&ay4-lsJOLfo$}2SXgPILrfD*%RhL zj#wP!p)wxk5q&&r5)ZS4UW-2ZwUryEE=>td3mlkpvFv|%+{4$T+~F=W)-V#ns_SvL&=KF(>BjAZj<3zgNnP- zZrpbr&mDC-M_kW$^usBe(~KMJZFV|6-%UGl$BQRj=U6K3_ycaya@GE{BOdbH*cbQu z+`&f2PdRDVA5ME3Y0G3h;Ws204y2N9%5$B>kkhC8Pk6`Ixcvz&ow!$QZ#3Z#NDpy8 z-@8Qq#O4BL3?kin7Rliu-|2Oo_~40wxHp`1(}})11JfPx^}EeQKDD`|^R*_kr`7U& zEveFP4QHXUL%|~x=GiZh)?f)oK+Srmga}MH`Fq26KrdY z#TsF!__2;QZ7bLn&k~XKbEuxHlwKj2!>kPD2w%a{uuNbMyDK&=W&w0)OC+j>I#rtw z?-W85!$YQ?_1rEQ>cnsZ8|5@;XHy}kaZb!jCCq%Ra#4;Orue04hQJJqXDH86(cL^t zrNJb-1l(xwHA^8_)%@=XSIXh)Xw}0 z+GL_pnfYe6pfXg^#T{(T?`3{rFZ0E<$mqE3!S3G)w6{3r2%9>J z4C#>VX@&%wqB7CTf(j(~H@^x52>z3(L&(=D#MGnuy>_t`y2f7?7Mr;?j8y^!WJVS1?ARup&Mldh^62SP@+NucH34~mX?JmwY9rt z7ws5jX3jVj(@YmNTR=v|X=0{+=@00qerl%Qn<=Mpdd}`*SiijQ_kGXve4p=gzRx*_ zOFk<}|8)86dEj=A`zT|RSC-8_R7|c;KLdmfB7OoqWfFCQo;Ha2C}xX~oeVlC?p*KkS4!}ZQzBt9?5BWd43Y*T zKFZl-GHNnr@a(DMzw1T4!f7xrOa{+sps{Y1eZf^>pLgvZT*)enN~$bY^1Q~nbK`2(jHN>T@x;JjsM%R94)LBwL1Zj-rQnE#?W7cCMUSRp@lbngXfP6PkBx|q!xrx| zVetVUS{&gci=$K@wD_348p{@S&>4wG22$BFYh%fgl*KVVv43^%DKtfGOFYt-)bKjc zj(Uc*QhUx-C95r+W)Apj$XbHU3#^E#ZilE$qQ9k zi?*{=;0a9iDMjjYs?;R4>I)jwm#kJ_(WcVh(4|hZLw!qBoncgE7*|tFsA*29S-w{1 zIIAvjQO)tQy2vl;dwx?t@Q0e$H1%WFsSZpY5hw2AZkdS&nz)C1annUb{;rDsG;*Ja z60a5<6(o+P#Y*S$epZX&rsn1W9u%^Nqz7jNa>PwSoTGD4vpg%sxJ;Wti@_R$*1s_g z*8auv>Pz_RDhrVrUYDB^)(DMDQam-aV#I&uw8+6Ab%$2^EczW3eH9GwhDLANyru2idKh$ghs_pSY_>XVW4os9 zsN`MVvxrtw!;no(lZGwg4s+;p*vW`SyREOuGMV=is%4K}Lz`F$??IpA`T4-763Bt~}mU9n^$ zHtMBQUep^(rUm+GFFO|9CytaC-#?a2XA^qW@AUj#adD;mc*bjq4iC3zs#q`KYb2{) zGLiK=opk0NE0&B$Gew?8t1?B>tZ25x_k`aPi>6}nWRaSQ`?*X?M|sHQLq4*|yBy|- z!Mva;G%s%ul2a{?x_rzhF2^`-al+*!;|BHV%t-f8Zge!^cNg>NUahloImKy%s`y@i z-MyT$E}!Zxb-SZ`qun__k?h`-NR7saH%S&2pShgjbC<20bveg*mw<7Xi6tB`Xx^O8 zd3$nM-^<36@t8k*dpi@EtiR0V3oZny@F6E$yaIzrEVvUMGrV(?UT`w9Jy>D=9rW5O ztpl`*P4%F`jRh{sN=AT31kz!jv*D#$bueR>;g0>$G?LjM;vj z(4@>vmdY3r4k|&rU{_-tI#?#wpqt0b3LDA__0y=$*9rebq<~dx7pN%UT+Ivpez{ap zuD*C^eOV6bSuU@_knc$esTi7R6T*_SjE(}8Gq}B-wN(Wky2#h<*D$Z~aMu*oCNtFZ zs0MYDz6Lc#twB$?qxO*kbvLOIkQX$=oSw)P+-c@Wg!Mg!Lj&XIG1!e4A?W|o`3~-T%8fDFVDNrr?Aho4P zZF=zB`ziOIBA2L&HQB*jfjMloj~aD=R&|gi>JZCSo*s3W_39}7>KNP9afa0iGI=#l zPMzYcI?W|@h9A^fCe?XvsDPVlg5T5yepg@dhq}mL>Qb>f1K6yS+kc9ur3sd^if4G1 zF#Rkn` #JV%cNCH1*iMM0%1YTxs`AT_qh-{wVL60wz%gD!hX_+=3;$!WAo)|#;H zvfg5~#TtvX|6p6JyG?7`9V(Z$R3lBhzT9$aMJ6O$BJCYgg8y$=uf$+Ysbh6FzbgH& myEwuIHj0GFCYhPMMwi$|+0ZOM$WHORB9>}f{*42SVg3uIejp_P diff --git a/build/classes/me/blackvein/quests/EventFactory$FinishPrompt.class b/build/classes/me/blackvein/quests/EventFactory$FinishPrompt.class index 541ee71f95f54c5599107bc42507ea01ebeb2505..2f1130dcade66f3b136cea11d016640fcdda89fe 100644 GIT binary patch delta 1254 zcmZ9M`%_e97{@HpKzuhnzG(^S!n3|@IIIK`+T48`<(ZjGo>S? z=DEvLCxPp^xXOt$ihj%(7u0iE(!O_p;&(Y>xS zY;bS^H}HneA(NH7sq@ycKQ3wJA)Ujro6g(gmprYS_Kv&4TTyY?;$7a;dEep#KD0Q( zM-pN2F-I*v;Zuzw_jX@_yVtAxK4bN4IO5fdKW9W|)Z!RT7GsQC9Ony*3={4JZ*f{@ z(&7YD7SnvGu_Ts?C7t$Y+_C%D#gp-E540tt8zQNg&Q}&E`C8#lX?TJmi*K0H&|@j5 zEAo&8oVNIu?=%)Y7)eDM6Om+J;|8Zcp6t^Qp%&BPd)4>{j%pOnw&|69I_+qDYdjY1 zvYnWQCV^)Zu`ei}`k=*G70p#BVRrxhvFJv-XCUra{HV6Y_SiOA+bESKZHsgK*~_#(Z~qXpCq{cG%m-M`6+ zC)_Ik=9ygnfD9WuFg}ppYLGJ`tk8w?g!u%zZ z6lEyRFOka_*UD5~ejr2XDax{$EGQ`54CS4*$MIzd9b_m+68;ZUkt3>{hxK>WpTN`@ zPSY&C1samL$vdySO6jQ1GA)&EkypC;vouHkIXw@Y)l>7oUh@#k6kTl&QKz`VGDzoS zg-7KK1Z(9Q!jNtg&0;m};wJjU&2nljjEYu%6Swe}SWCOat&npYq?UCw$~k6uIgPR-_snVZ;t3YIfxMEu2Ki6fFO@Hs_BA~J0xO0fV*mgE delta 1381 zcmZux{ZkZW9RKV-$L-#_gUTEs;L!spB6kNU=1f;jFh$9XUKuq-X>`IKY;)WiyLT78 zaGAZ?i=t~Kltr)FD+qchq?uNh^+P}OH}qrEjFZzanSGz*a>lX!<@h(2cB%j}v82Nti^t8RY4`J3vX|Sj zw85QzgSV#*D%ObESsinjk)Rl9CmI_t6nv%QBu+_K@@Om_Yf8kDeNCOtpqcE`@wMn= zHMeRyP9sZJzQJJ$tx?M{BD{;#`-Q@Q)oaF0qn9)bN=|=_ypV9*N+hfdaq-P5!**<* zvW*C_oe{)dPEVNYI4e$)CSgNIeBn}884nThkd-95OuxlVo5y+_Gi@Y>c&{a>smiUm z(6fz#4siuCW+K722@iukWR6zzSjx=X8fYX7-{viJ8Fo|DqDvCc@g2UG5Tw^r?fzC& z={qMu7R5FBOr3Wn`vE_?QE#AhaYr&8OPIaf+U}TEvRcP^{4_o6EtB12>I3c;-?+Ev z&U@P1qwc&f;=Q4{Swg2fqSa1s)yAbp`7ik7KT#}SM7cbVfc!UVhN`mDc zf+ckYnnRb*T&uCFP`tKM|9_R$LZG2g2~Ey~$C!5`5 bK*l48QmmlK_4GH}M42$fy%d`%z7F|cit$L9 diff --git a/build/classes/me/blackvein/quests/EventFactory$HealthPrompt.class b/build/classes/me/blackvein/quests/EventFactory$HealthPrompt.class index c0d35a98f70690a1419209ab787171da9d356b16..3844b31814dffaa353a707e906e21d84846cf9fc 100644 GIT binary patch delta 890 zcmZvbO-~b17=@pimQH6FpcF;<6p#-EOi@Hc5kx=%i+~6Uh+1HTN}&n^3pe}&H?!5a zaG^_3Q&18$F>d?|Zrm9qCYqSIGrrRjWML+`@44^Cx#ynA{gC}OxbpGO>o>qL<_&^0 z=(3zJ*iWOzNdqs9I!&B%(P=-;24`q-H?8h+)}W1Z2JLicbh?e_{ai>VlP--OKNk(c z^t$y+8hr-2G-wPc`0SbJVtJiHS$OS!j;dUC9;i<;3Me$mBj2QeL8rx2*mK2Xh+&hf zTvN!mmaTcab1G`b7X~f6%ZkM8nf`_N++AB^#AK8)xAVHmI5#wIn%p9yF<~;vl=I9} z6tWmrDBVSq;s{G7)@FyT$f7-JEyPW3Gp#Y>{P47-M@{Z9YZ7D5Y4ScQE}FAK6S2tT z?6MV|58Yd`7VX7Qdps6j7_y@==eKvf>c1^ZQVoS8^V15RY0FlqbcWI@UJRs}ic;b< zdrO=#-%>$Pj0YtUaD5QuMHMp&Q7Ce@d<84TlJm(9{SyZSn=Zzngo6?l%BgUB1^3FN zDlu;p@5nl7&+#SDg8mKk1V)1NRVk|cBmA5s%uNk#6UsQ1R0*Y*LmXx$#r+7*CfbzN9N9nS?-B}ofBV?t+GjQr1~Z5I?8HIFvp$TU{8X*PcdY#2-+lf zyJep%(vuWfj0P+E7ySBHvh;7%>sz$y-|5qTGOYhfsxL{&+EG8TtzM*3O^w{GRtVGZ zv}XANh_j(>w>qTc-pE&7Bf{1M?Y1W6wUBqYEj#Q!>f|RW$=p$SK(68S$w#B4Pz z-GVViZK7=4n7DA^!r$S_jq%*J0W--x-@S9rcfRw@oiD+!f&90>pFRWV!*h-R27I&( za@1o;#{~`*Lp}^+M52oZF3C75m&+VuxWaK2<2oi}&NTzqt5A(e9a9FTIc6{`-_Pl| z!BL9=9XA;?XFa{u8fR!uY}m0>#+_2b`@6rH?-m0XW;+t@xGLPD@-iPn*hB*wO@uJd zQ2)Z(v0@o(b1k;$cng{cn-YWLESf1Yw4hby5}u<< zg<@S1>e2zc@1PZ+2aN)J1@Jw3qu`jWqr_HMuBfn4E!xmdd@9bNL-OXS><}J$fMizz zRmv`=Wqgfzv;gxE)kp14$aXd5b|2waP()y<^F5RUu)Sz7D9b+JWC5q%g43Q6Dx$WM zQYRI9N(!5x(}*z`ymuZoybp2SPxo#R2|j{FK3bA4%9@U(Co9rPC(fgj28$A*7oO1? z%@6XlN6zDZH|m#ML+}vMCCC;rL%tkc377oGLfYH*G=chl}J=M6fzV9-gIMz`B|(a)t!vgy(2^K;oCOut*d zqA_5QPm{)wg3q3hELAorRD?Gk=Bdh6=aKp}tB7Kg0t!uv7;b;hId#E2bHUDi{mTD+G6`ND=%vrWVwKI}Y^=>G`RFpEO)m!FF z_?C-;Vmv5;fa`-GFRGYPj6#X?(^s@wDmkC*(APL5*mN-lWgM2MP)U{BE4W`KRfz@L zc*i!$c#AKI7W8kSCoz&_u1itnAK|kUVSajOhfv0;rbZ~e9N{RdY3^@$0B50fZot6Wx zNKZ;+DH^QmFY)WI$kAWZsK23I-(W!hz^J~JQeT#qwX1%5N4-d;mO8mxy%1*LY0vQm z5NAU>Zgok?y^*iBPK0d;+G|bPYa#D(TXxxfG{{do>q2?mI;3 zv}M`n(8PX=0}clJZMrz9(4jDgRqR&F5r-a*Ivk_dqEF=<4|AfHI{Gb6hB@Uhz-jgV zjKx`p20AUyX_&={$>}XAjh6J3pB&2uCym6y(OP zxq{C~r7p3tj4`rE=s9KyD;6$cmvH9gjm|%|Zxy!2YQ-{})UuUr!e_9ZR>eCfW$&nw z2S(dV)ap+;rQ%~!Z6(}y)UC8zrP|e3+r1*9QzkmH^9A}M+I(9qrpjKjy2P4iII`CS zm1$T`X;cbpDhfAZiQgr{_V+>R?H{D|cBn}As+v}$k1k6Wo$O$z7;6*4 z5H;QPW(1k(F6Afq7;d`pZwl3!R;kPtDwCvq3pHnx6uX5=mp??!Z!gUfKhwqyGi9l#Fcv diff --git a/build/classes/me/blackvein/quests/EventFactory$ItemListPrompt.class b/build/classes/me/blackvein/quests/EventFactory$ItemListPrompt.class index 43950474d76410b31ebc916eb52a0f6c5af56feb..d9fa261799b0db45a35061a036db8e6fcad96ac7 100644 GIT binary patch literal 4043 zcmd5P`n44?T8eBuW{2YAj(N>{epq{A0HqdjNOd9Tm= zocFB%^6%Gv4`2|#Z9+djpy81aJ{ZD>LilhP2VsOT8%74%5X>+IJ`%#5hWTbHSZe)} zhJ`S;BBvgfhQ%-<$Th)6Ud;+2TvlUIJsh>{hEP)Dl6qWGkE6}A zC)DFHwfV^qJ{88N@tF`l8%6++Yj`4zE__Zo|9l8vXvP=uB@JIu!F^T3lVJ>~@o5du z2sFC$meVmHuqU}_#%FUzW?{*+?D*x9>9|gOWXZJMQ6uB#i`R}(`nY9V?n!}tvD=Gx z%?Jb&`K&3hHEG%AL}_u>EKVDtFaj-OuDO`B9QRx?zgTbu z^fB8ui;0}!I41WG+}3wTtp!HDWzMXan>Me~nATq|!o z@r3V7pa$7 zTWxu+6{;l~^o60)IPUjaFZ`1X@^Fn(6@fca-Qs~TZWKI<@a$>$8o@9!8MENd7&$9z zxMp_DE|dsC<{cJwbLL(CbZS8?labj-tL!aAN~tojh(qttafMBO!Zf9y5NP6V!KhVSY4KAzL@JYHbu>5HDRmdvPEsAykUE&o8r5Ah=%KgM$c(D4%`eM3E7R4aP4 zFM2AQjam#k%-H#w$eBiwbB*)iylv|EDSk#K>i9W+q2rhMm5yI4-Nq>Y`l1?c>Uasu z1c@GhgO>$*>b2K`*WjEtPkWhUD#cfHtYDQGc$KNdpHXp`*?tYL>R7{T8rB8k^(_1A zxuF{>>-V#Z-c~J9GiFPWLzu3lLZXfU!_f$jCg zFVe2F!ER?A!8)FpK|@SkiM#6Ip2+9&#q+#B*p|;sCWqCn;mbEMZ@8Wa+fSoWD3~@Q z?5pE=^EFjD7F4W}uiRm8Cm(Y2Whs&{wpoxCgQt_{N7Ud&ET=|NBhw5pJ(5gL^3=+3Jk+wka(^fagc;jtzIb6i zzbFtRw!Tu=Dpje?ZzO`%aVK&fMeXdAab=wJH|E|dT*eWthoir9Aj)sXgZ%gvt*z=l z;4BEC`Ujtf`8Em3PflQ0ch4&j-HpFPAl(pYNTq|3U@9#mGPR1vmnaax5k6bc0LV5- zxdS`pJvhoWou+62$8eIPzyla68*ku=p?L&adLr5iLVv=Ao=B57+1uT-itu=EPo$ae zuR~wMmVme2yMmS*h^}L6dKIlci51+X)YU%C32$gt!#W}qeb+L!tzdhkZ3XQs*fC!A z^k=+S*`{9mGVWF)_juEL)wIEz?&NeCyVSyc74^5(3U1VT_nm0Tjat!))(!l_gJTW5 z1t$8|ut(rJ4s)_sfY=-j)&-EHS`5QQkNOu zpYDDcVij>}l2_E+x{iU$;(?n&Vcg(hydO=(_(5WvB*x>oS5DxFoWzhkhopQ6=j9X( zIql&UEr(adf&YG%abUdbo^+bK7roiTIKeT(_kMgC$2ksgdhCQOfnmS2}e0+ z@BQYx-}`lMc=2CPKL=nP{xA!T*e9b;LB9e+!F~k?B4|Zk#y|uL%vmU4P(TM2SYo%u z;wUIaFoZ+m_^^T_V!u-??-a|s6uevP?@@4LFdkI!5d|Mr@G%7+7fhdsAcRlKcqoE892IImEjS)laBMa{gU`zN zoFIEd#^)nw!chgs1<@B}d`YPLvW%}pun~_a_^N^v3LaDNxPq_A_&P&{({I={YZ;cM z2lQlbUdtXB(hW0tu&CRPo$MIWO{Y`KItA-UGf{6gOv7nmSdo~XeD!VyslAZX8Rn)9 zQ{Pq`=+&*AT5p~((R3lJ<#%hAA-+ANB#dFGOgZ{M+OVBlt-`>d!=R>2Q@7glnr-WJ z-Z-u9nsNzb`J6u86Sq@8Od_`=(gmw8*;_ntz;Ke;f;psHw&oZG(@wSrz6f@Rp?P(B zzc!>L^P1V0%s7@|_K{F#Fw74eq=>dpx9B8f)G#b49TgoTpCp4UjiN|rGHDYs8P;5# z4HV82Uo@a|+?Y8ThmzN&4Z6Xkl9urevO&vc^+9L1mN#;mqvulQV39OuuhRX?6|TOr z?WMGlr{RK0sb(pHoI?c$Zj`h~C>bI{sT^gq^(syAGT}y56bb2>l`;BE%_&->ZP))O zZgap@Kc6k6qtdgvZJJCHKJ5hv|$TF)#S3Fcr?;)9sQc< zw_Zg%zR7USWV$UyBcIbPar`YA-&S!Fr&J8%J0!Cq?y8H67~1iMh`>Lg;z^8|DZQWT-GM^J9%hm;H zw373J&ZT!LDgH#$p4T-iLe)+1RyXfeK~9oRB5%hXD!z*|RGKQjhv!v%A1_e!CY<*| zPNODH{~F>dejv;}i*qu5sNzR>k%C5QDm^#H(@`DN7O>Ozhgx9@3bH9HZ2B>NLhU%+ z1a!v=6|Fy)=6FS1`WC7BnTnV2a}~c3v0L0zD8>hhwj&}s5#)V_Wjjk{{8GiQ@N0(T zjMPrdL!oCY!@3!HCx*R3#?APO@W4!$G)Xs#EG&4tA)W!R$^v+^rUEC}WZi8& z3<@QBJPpC|?x%->AopwbHuut`gzP0&)BPxSa6)g}j$Lg+uqkf7A`NKbqHAc;RB7BH zo;tckb9Krv#qL#N)eP+SZ+cldsEDQ$4Pt#r*zh_9z;I%aU zo2Ic@RHC>$I}6sH{=xu5g7Q0UF6n(m0StF{P<7VKgqkvLQ>Aumhq@^1THlqNBWsAz zDJzXt!6z z%WCVM1gn*wMW`nn4QG0!sFdm9QJ(3kh*o4qA)g|u5ISkCL>Q1>0heCIQt8jQnQ$t} zBPqBAZ=szbjjoc0aE`b*u|7NorDqhgh7lRT?5H||IU}g-s*BDYLDe}t?;Y0@ei-uv zNz?`B3oz`03kV#>LV<{R>}6cnh?8rlI+-kwPnLJxOt>m0b6xLoonT{ShD=s>nfZ%6 z#@f13EIy4T4BHw`;|7LfXd|GS;SA!Nq%xtdcS~IpmXV{^Nh4VP6lw?&UE$mD?`P_w zE8Tc*F5{hS5b;u!1MyttOTax>$C&UKg(s`aJ!!rQPi6;v`0u6ge@Y#(Q=z(edY&e?fh!7gznRLd(v zcksEPqkO*G54S*OO<0R<*ba$R6Yf^*K$u-Zt%rMs`q9OS-thWHK;6ht=fpyHQ*Z8~ z-q}s|#UWqBc^P{yqE*IQUq|N!wE1xB1ss5c9_%f3T&RJ*sN>l7deJwv$51tfx}Mr6 zz}P72Pu52%`-E-xTd$#R1Pxx+hp|R9QL>cP(^wm#mv5uXJc@NE$I#>pT2F!~7bK{; zjNfg~Hw5@e4I9A*Don8jrPW8Nqe#Gsk|k%cumqgJji>QOhL#iH;g(WGpGB+$_=g*$ z6Q~Gpkd`czj$`f^HhM;GI$36p>rOM7|r);ZZ{?X~Y(HQ?yf&4pYgRFuTYYlr_hFn(4p>y}N(?6A*+ecC zU*{Imxzy5ubT;V-^Ff=pIAn8}qD8ec=;Ykx$+VjuLK zkJ-G#yNcsB?=fUCD_=;(w-018X*VwS)9(JJcvm*D-ziuGd;5~@NtyqBn-iQ=oU-|V z(~1ub-LSX0tfqK|k1S?5gYHyMBQoRk+jtCHL?_e_xan-XGo8yg$^!6Jl5yLw`UW*8Sf{5%&Q1) zoTWwUvaFL3*&zcHxn3u0(coRQVxAXVZPj|?{%B}fKASIW5H+4(^_0#cC2{h8E&M6R zwP^Gbs=@0~x4qwjbG&Z7#A@^wsygp`eL?vX$)v?h*+;!x$gQc9e2IS*6~-|^0eoUx zlQ=rx`zKUWTp(vb*`X6O3$_g=Obc;YWfB&eTEVZ$O`oi>F#?;eQT83d5mZE9Cp1EM zgz_u$qmO%pJ0=J#OPB5v%5};A6GCaRh$l@jgxeRzkCJxNnn$q5nYOAW^1uY|gXg)h z;3~eWRJ4vV-N!hQwm>X!i>_E;lo=LnWzCW32s3Xny#&UoYztn-9-~rZR<#9V!C2XK zW{nW*mWr6DuAZVSQsblhGOevsQ$1v+s-2o@l!twcQMbw5xrTLRjQYEH_LY{%Ba<@c z3b%DX^#t>Oi|0%h*G>v3j{dLg{$BD%0~2p_D^+4qA6n;$>OC~-0?pcGk>1N5%%e$oYTknQXl6VJ;V)tf*Wt4T`*l`J)9&$Czz*H#%Xutd0Clo3n> zO1$mDTVgY4DPn#t>JA->Wr~*+%l}3zR{X`B`L`)=X{bQby3!=j``WJBaxYw^wAM=p uliyNW4SH2lZW0`%gHGw|liZqEuHsQytEIk9{y1CZ*l9q-vrQkSjV&dAtp0pGw zE<0gOIxJ$5kN~M5B-EhdHVvW?5 zy_&YCg!{PPBvL{t{fek24Vc6Nl+zhtFM}El>2O?gA1JmZZCH^g!D63D(j*mN86AoT z6={>qfW<=`w0M|D4BqRG z4-Ppk(L_8tY^RcT#O_a|1Ue}@GZHzV0}0JY#*>3~#!1JAV|K)8ww<9^(vBsaSlX_S z3=Guk1X=C4qmk@NTE=M(q|)=OXd)I#*SG8KJS>n>(TEdIB{K!OE%f?mBpHn*@`~x0 zGn!87QXjQA#A7B|i^Du_Q03MZRqZe+l0!|Nuy~TEES}~WlV>fSW6Yo;l^$&E9~~Z! zJFWSqS~u#}ES~2DgQc<_f-DGCi_ZOyli6f$vlNIm|MZqc}(4nCy61RQn{aR#C{9QAZ!wjWiZ^%1KXUIE6 znL*gsRJJt7WwVqPzzpSK|52=I%B8@Hus`Gv`A$-qqpC+3A*naCC|T{H=V+G3mW6(5 zbU&9D`kA8E!?X-XC!D}IHqEj*Y#(bbTb?g)g{T_;6TO&OpJ&!yeC`4zi!I8Fr^qdO z^S8K%N}0)LD0PBTHARCu#cK6AZR#{(HAB1lk}mZXyVWcM>TA;K8%EU`#?`mHqrT%q z^*xj7EGN~E%&MO_tA6G;^$UNfU-?V@o}W%PD$5qR{cE^ZOwh&#uH$-qbg_Ic)*$b| z4TPmAna}(f1r^4qV>fb>3|VoGo4G}_)@zGMq@a7N=oZv8+8}$im=|a_*=Vv!-oMTN zpiH)$qhaNFO4if|5qq}JS#GoF6iJT1u}MZSDd@izD;U-;Fy?EMQ?`oHwTb;=**he| g!?t|powUeWE&Mw90yazhHkNclP|4S?n-M(!0`XNM9RL6T diff --git a/build/classes/me/blackvein/quests/EventFactory$MenuPrompt.class b/build/classes/me/blackvein/quests/EventFactory$MenuPrompt.class index deecb3bc37293a15fe54d65b5a800c6974375221..3d2e5a9973e1dc48afb937dda32a5aecc2a8ba4e 100644 GIT binary patch literal 3931 zcmb7H*?$zp7XB(TNq2@8!Wa+%F9QY~Cd(v%c<+r@g~9!af<-%1FuBFXOrZT5-LE8v>AVV>J%ozhb1y7!ZA0MkWA`n`8`% z#UUA*=nsl!STtD~BQkUuhK!tyQ88!Au!Oc9KptZf4h2ww!!pK~VFPZKaf_J0Rl@%Q z*o-4W;|>`|#p0b3?g|jfyJg%{joWZQWjrL|;Q(52M8=~s9+UC7geL;n zDJGtj@l-XQ#xoM0WvH@;G^?(eVN+s+M+dTMdU%X$dUQ0;E!&F5$GC2{t7+RX$6HDI zQcc(F%NRC?mlogJ&)|<48P2dGq3OIUKQh40K6M~VGr@$BRu(ni*SfJVC(H>__gf(ds zQ##e0lR4roWi4ss%`|V5qOjUh35iL7(M*LX%FzV>N$mP>e9!7F%`!53-_D0mGg z7@**Fq5Otu-V`&m7$VRm+A)(;3J6eu*jq9$Y|oc$<5_NV1#byMetuZ96}*jiB)qHO zJ-pAbri5_w;;7&Qe8{lQJ!?(ef!*Y6W;LZ90176Bh-_ptap9VRk1!?SV}|CXj%%Hx z(4~&>;!#?$U`E9969v-(cyr3ghcZS;H|)@mI>tjeZjNY{MF%5f8zC1>Nau$_juER# z!3;iSs9zGs+;J59UCwa6r@z8`1*hN$B&pn1X= zO;BAYcjzO*u%#45S*x_Ye|KVUTy&0mmA&y~ypOy|#S@9{eN;*J^v2^|bZBkEwZc#v zUJQ>6HI&VS$ES!YEWvCy%zZ<~2t$}mE~!qRR@$b9kLJ~^)iJ0WCXcBWm9 zUvHe~w#*_Z+)nwdnvFfQvV59MEU|1DPPc+ zO!L~=Ku`H-e|{dc1xb|M(gkx*9}aLKC>EF}U#*HdSB(YwCj+ipbT? zVsk2T5{%7Y%Vgu}h+ibohY2zvJB6(km_@{qn?e0#Ly&?-_Kr3N8w&P%gpHGEJc*`h zL?^Jlu=i<$PCA-Td%MWyELw^d?&OgMHHaa^(x$3M&BpyU#c zdQYeSHGi`y{Ckp#RQsHxp<^A5hv>iWAXZ`o>!G6#2K}&&QesV9OFw-o4k3$i+=`p= z5^kZZbo%+Cj_D-#s_^d(N`b*6HH7r#1|9e+Gmgy67^yBT6^tpf3v=|_E|sI z%vNQ-|Ld!-fet>6QqN(VyA*dTx)t{*?seGBeKtJ~iry&q^MLUlR6Jzt5feG8c-YuS z%<`yNjw$*S#}$v6-3i6x27J;X#1o1q9pd!c3^-KdcNxf2QJ&_M!yu>4;TfBx;+Z0L zGGsICNM0j0qYg2A#h6Xnq0zV#QJ!VeX6lRI%0tClj-=xQXL{lzN8|lTU+)jsglai+3>P$J4$SAIe{Kghir;;L4am9`cj^I zT(D5X$wZKf%|(~jc-;~O*+{Mav7pXt=M9%PdCTUKi{@>ccU<1(J(u@cu&C5q!~h&(cmX`+kE8mF`q~RdQ??ivRf@rK%VZgFY1`;)<3BxJ)&B5S#)36 z=CU4*_Ud1v^ZK&dtG|oxvUZqjT05t<*UPH|tE2>Jpm<>{=~{=ZoqAhQXXXZp6-yM3 z6X684oa9E?xq?7m%}wkRYjHFC%^mUokhf>>iz}$UWuiHpC5p=2CAQ=!HtyEIEirC5 za7)F_QDy?=8)2Co0j^*(?y8NrHCSXb?CKz}ZPULNZiZDzV2R3}=By+h!iYAX5M&0( zaXL`!fY2 zQ_AokoEs^x|5wUJq09t%HVLQHOgJ0X^4iGJd<932maJvU7!JyKm{RdaiINg;j2hB1 zTgKVL1jl5gB$$%ZvrKc23o<7@V}@mB`BnzP56n&Ts|LS6#>A$?Hi{h=J1>?J^*6|C BF$Mqt diff --git a/build/classes/me/blackvein/quests/EventFactory$MessagePrompt.class b/build/classes/me/blackvein/quests/EventFactory$MessagePrompt.class index e2c68b51ed8775e60998a283ed5596ade1253d4e..d14d510052b990324c1c442efba4e426d6603b38 100644 GIT binary patch delta 794 zcmZ9K+fEZv6o$V&?R45I%A zOwn7t&7)+ToF=TMl;MR6Jt_7zR zD5eM8uKfF69c@@r_)5)hQX=v6x}jVvf6t z4rkLTl&4m6zS-GUn;J>C>zXM+~dA?biv{Qi;B?7+Ui86u;Szm9$Gx& zvBHqqTvxH+C`@PbFT)^h@q{IVr-~uh7MVYMA5^DQEuo2GzF1l;=ko53f4Me`Y)G4$ z5y1*y)+sCcU0d&SE&Zqa%71i=9&xcnTvfL1-BT(*nq0O`e27aoDxD_T987#h8{EaW zEuBWY#DJW^|BDW(Ew9GpFx`@saC_^7**YPg?C}vvRKj-?L`>Ch;@z47Yz!OmM+ z^0lQ}m=79D!QF5%Y$Qkdh56b-xEPn~VdFu)wlCt$I?QodVI;>UR~)W#O`%5+g&jU@ z%q1O6GS?k$a8ohbdaMPluc?6H~J*Nv1*q@#)aKACK*WM#=T z@phs37Ol`BwJMoLzgR==pnqmSVke5R*~Sj>ik(7E2-97HzlL7zkbaHP#`LT;r=xr>u>3KnKQhJIl zB_*Xb+-l(sT8B;2xha5X5}&k8@(oY_PEP;9kp7dB{wtOeBu&<(RJu~6F+=PXp?M+5 z)^a^=L@IRUO~^?k&nOf-sQ+(mCV?C4aD$>eLbOVQ68iPSgKQT+AV^OhB`1|( N@wk@!lx5DL{RJibXcYhe diff --git a/build/classes/me/blackvein/quests/EventFactory$MobAmountsPrompt.class b/build/classes/me/blackvein/quests/EventFactory$MobAmountsPrompt.class index ae02d2c3ea423e10a3ad746454e257585260e1b9..409f31d8736c1f393c89ca780b824c595fc8fc3f 100644 GIT binary patch delta 1396 zcmaKs+fQ6o6vlsNZhN2MV5d`tGNsc_Z9&ULq$=uAt3YXM1w;XnYHJ5L(rICa4g=Op z9npHPB98S^Z%Lcj2cw~Ard1N+n@JyxjW0g<*u;OqG*MhA|FX*-^=)4fOH$pdyeWpRf06(1Nh&R&h?QpVbDix2t8;w&E;51t-4=(9=H3m23!e(XmX7Tyt zgj!;|*p_4Cr-pjj4Q`>qi50t3GF`HV7w`;R!aI*Ij|%F`n0fqpO6KIFiz1-*6adSY zlU4vFom*)XNJC_M8`%Q3Ya4E<3D;`#SU*tORTsRWfV<`_KQ0iEdTV2zx?nKRx|lcY zU2O8Xn^Z`JeCPN)>i*CmX(uqR|*W<#FJ{tN7ing5RzDI)y~=#(-pEFG>5ZVG$yY+fL`Qew-Tbfj6d zKEp<`)1pqt@Dv)?Di07{g4U&!=`}=jfM#7rt1f4sUN0}Lf@xjJX}yIRy@^@9nMEDt zip2e_tN2xKFEo9e5?a~M?c9MWy1ttx?i8z8YTYF#EgJZe7|mI{GMO*fDSu*CR11JCh delta 1387 zcmaKs+fN*I6vscax8HAG}kNgtO z{`}YXH-Q~|5g^Plzlh@js_0hq1n|)9rEWPnqgR-Dnq0`wDCyc}Q? z-5T5R2LcQ-?sZcAqD zv^ARQw_>BIiDYKn8n?${=~yO_9JK6Me8@^AZL5FMido}hvAA7trP7vN2&#_9l5u;a z+RCJ?w4IqqCmqr^P2S>dDbVB{&KrbN>A}YSiQ(ZyrqNDTW)hjn#;%drq@6bKtue?| zOx|VIpfqQ=OZOTWmdSg(ub4CWfO(S(PQ@QGV-QJV=ytY?Z8|mq9->~fK?4u3GaOoH2rc93Tf%!CUmjJW^Z4@w7P11ro35ik z7b+wTtMjjDDgGXg^3#GZX;Fg52QkSRbN6gOplHxq~T;|p?n-l1U%T7<ez8QuALxd&dlE5-e;|E-M(|a4E!3% z{&MU3_rNYLd8wt}Bg=r7t%OV-@!}-p;TVG&9aju_d6Z#&7}3k9m&X`0IiWb|<#A4V zc!IExaUv#BAAVwrC$-Up$x~h`2ziM!snL|aPWZNn@w5(+RHS?qbK2x-leCvQ`V|?I z*>5iXvMz&epMT12n^9GfZ;kj@y5l&772Q%q- za-wTCo`}ZMCeK1bzEa(u($P2Mtj+u|(mn7pfb z&KXp!^BPa2B2&RGy;{7-`vx0gbD4EX%vgM&oyzm2%x2<=U|&2r6^r)8XC$`|Eo?rr z_?Yt+pYW+g>jlnPe8z%7)w;R{V~JQKlMi$-o}S5Ae9lFKUG|UCx_P72{@c}2?2**F z!^uc2VbEZIVFc_U_kd9&Hszk~R3eoglKA#d?vtx`g>=mkw?d?#>fd6r5HG#hrUZ?S?$N zX(OBGHh!lFQ{4Y-%3-Zg+~4fKBhS0x0+)7P!EuF>mL*CZtl)2V2Anqt1)NKi8MM2a z{N*_|-k`JqR;XxqU&dOdLei{kcL&@7*EKff2n>rwK(gMvMwz9`!SH2TTGpzn)>YN4 zRkg&O4wk7M)jn4-7MH18#r2EL{w@EfS+mBOr(AEf-dl=v=6lpnnKV7yj#7IlSNmvG z`)N|0w5bE^RXy~ohvl0;!YS3ugz95f^)s&qIIlu{r3U$04RKu!^RpV^H#L@T_AwNP zq?h+{pG>ulPVVOcTpXu<^{!FAjt6O%B&6FkP3Fg}VPPs7b+AWfruc)s>=Uy6VydTD zAbv=Q3v?QF%DZaZx9BzLGU+xs@Gr`w=O4E2xQVZ!1d-bzEg`$rsvNtmj)L6kgkKA= sAUBN;i%hiy-5jA;qB`i4lSAa!BKu~sua&=Cv)mk%of1Wz>@zt217ME_g8%>k delta 1297 zcmY+E%X3q86vsa|O>%!pZ>0}g41I8$O2s}czM$X((6MSCv_5KqqHP-5*fgohZL3xc zR-jfv9v9y@;;?{);}nMp*3M{GEOZ=}Z2SXUxpCp>IE?4lv=le@eD68u`@QFtTo0WO zWq!W-!;iogJ_=GrM?fB(LBe#I> zJ_mT&%3tw-4h!gaT+7>SY*^r zChP%wFrF0XB<*xG9*sD5%xSQlk!Zq>CY)%>4i5|sg>_i0#59tqJ(e7_)8hkE30vp` zPE4fYv9!|=Or}4fB&RG+Giz~%DTAuMUM`6>MotkUAR08Z^E9#BPxMD*1l>ay{KpsN@f) IngHWHEz4dlQq2?o4gc3+c6HoIZ>Er&&c zawt%(AkflkMU)1m)sR8}Qw3>@tcv6Z3-6LUx7&l7T zFVUL8p681^> zoP^Iy*e~G=622(mVU9-}$ibJ=@F)(5&tnn}3Zcg(JR#u_$Cn)_M4KQT7WSW%@RV2_ zalnGFa6Ik6T(k>BM+LbJLE9Aey@y#?W#sug&Hfz?VVENf~o5H2V&t!S>1z`UG_mGWx2z%K_H3p`p#4K$Kc zMmSu_HY{ou!w6$1qN)CZa!m=zlTo3XVfqJyLcTQQhIljzQl;FgJB?DF z<0UdHd%a4lRww&apR6gq@<3~ZjCeobf%_gSr+=7+XX$X(V1Pnu)z${?Sup_N@V z5I8)+NXV;{sUqsb&G|H4_|}P=QNxg)=x6d)A^oVb*(~~9PruntcAF^h7=G%+&+v06et`=NaN?Ij_pij~*MdTFnG7RM$~{VtG}+J0rkDrF zKSZWw4jK84kh9Iy1xNQ0EN%%#0ve?lBfS}>?W&-TNY}$0q+yn>VT_5T*yq#FC2C6~ zHATVeSL6^e`}7cv&|RnJCRJp!;;T@@niIdp?47%NWV0$5CF{V3_r|82^1M+*<&SvXi9Z=3`7`wbLs<-C*onW0y*KbzjyD+!25Lj1 zz;#c=TEx(Jf=Gk6ocKHb;lw`$`Uxhqm65P!3Q(CE3Tqtya^m0k4@2%?Y#U~Um8A@Y zgOP|jD26wk@FtLQ`iEE?@I{$*unZHE@|t;^_%GgO7;S2Gl=`Z+u3(8@UZ>DCdD)3~ zaD`#!VBp6h6~jNA@F&vDSxDPPb(M(RQ+!Tz<9`f8&ABJC?p?e-7zdVw6l!RdN+1#g zklvSMwl8wpqu!-ds^Jz{^ENR|HF<*iuc_&mscRJ2|Yb zi#u*yGAEV<{lQQzT>?~l3#%(iNsGCWmNdzl&O+TYMQ&|X0zQUm*(Nj94J#FIvKuJc z?MN_=KYBg&y|H@vlL9rG0bOu(9J(zTrkGLmtCh@4TF}_0=9=BtE^*}d>vy_fd!j&d z<7OL5_B~2COr5J#*5m{zNgNU-k&72p)Vjr>d)i*(_PD7yQ|jFn71hf`1Zs-w39uTy zk3~qMfD`X&-Xw>s^!u5DyPQM=`Xc^-y>^Rlt}Pad1LEe5&<#gYbjwSn#WjnKy|LNl zeSOm#6Z^s%x4ViiKxI`#_J_+G1Hq6|B8N#;MzTNO*v24l_Nx=ygQqhx8UR5eSa{B${h>Yc!Hque+Xb6U6ugojN#O1lks+jzq8Q zfnt|ch)jCgFQLC`SbDm69MQ}QCaxR$*3zmTcKY)Gn3|h+94uFQ4wibW%j&7Oxon<# zyUXsWPjRJq>bZ-1PCz)T^0IRKb&~$Tn1ngSJ`6#+@}$!PR{iJGv2vGsx*gZq>9?$Ya=#c{Isq zI0MTKwm2KQKd0%)rju*0wFx)HRJFZ#HqTWcqKd6?Qi;ffRA2AJA~eXT#zkmGf@j;< zh7XUxNKbK)1h*8$+)~(ynREK}%q;Ru2A%PGlV?unxn}F0skMg7Rqp5{0!X&;J`Md(_c_rF; z6<*`jY${*Enz)A@;Y-izSEnE0)mb3hJ%O!q?^&0NAj^#dUkT+U8 zc$4)aS8d>}wi3R|wuwjdwssm3X0)Y>nGXsz)k(HH@k!EWK_i_fAC7K7W=bExlN{uS)##v*-Qas?|)^o_7# zC7O-KY#mRl6zbJ)<%^E`(fvs8!rc1YV_@tAKGvS^qHHB}fow@No;eP^8PBz)kI4m><(sOu8tCN!PBc=vvUfu2=&}f}o^-DRGixC>5yBz|Bsf z%!*}QSQvx#34%pwN3h&+C)2N#@_4<3n{{Fl0WpTzVlW>!-$m(1s-7@Tcn%rHC1;~?iS(wM|H=h)hiVx40%>P_DkeW7RDu5a7NW!Mg2WQHxnegMO|P#N`g zReKzKJuubr@XbhBZx!srWU7MoNac59B)@;z)W-^)t*K32&eW_A1#O3z2x zN`8=q`QvOGKg724!)!Nyk{#kl*kS%OJIirW$RcOa?1@*fXi_(2 z{g`f8jL+z|sje(&B^(y4!g3mCQmqux|BTiXWiE}+&^VvQQ#3B5@dX+yX?&5!ztM3y3dF&_W` literal 5575 zcmb7I349dQ8UMdM@+O-lgoOkw*CGLuupttZQbMUASED%~%h3f2on*&kVY3@{XTwpc zz0gu>t)eIeTd*ivZ3!s^V~S8z@F;jyMMZmnwbj~UZI$b1`@NZ+?2&|o{C+d<&3C=; z{@&*K&!2b_Kp`%qVg^DSVF{{)h=f)Nt0ks`zK8D%^acsHiuE?}`hj?Dl<-5bZj$gL3Aao5v4lG${Dk998^++SG;GG*;&qRN zErRe~3HM3ZD&eORwn^B|alZ|@_?f`{TpYMV!cGYfNce>S?Xtmy2RRaFF9k z8!E6z!eI%&lW;`BQxcw*@Qj3`9LE?^)Fxjz`x=I;tD2R9dcWMTvQ_Z~3RXpwuo^BX zYgGbjx!j-zLu-qOdX_KXQ)e?w$myRvcOiqNBA>UJ1>Y>-_|AR0SJk z|3W$B6W>vwMJU6NS{LT;4{{BoeNz^#USfkqO_ zNDoJE2$L_HVVI7Is6Kx|rK*Hva-CrE(NoF5=};k>Vak=MLcY}b2Dw!VQnlQoIgJvY z<5@aZZfH;<1XmC%na{E?O_beG_4hATsW_5Lt!KyZe6#BCI zbPa6oU?kL_l>0=~hs5X86yaMt=An)uBiYa7t*P`B(ld>oYw5Yp4mX}-7@kZ!C*t#a zm5@L`&+&pCzsGSqPT)m`%zUSIq?5A3>28r%2g1&Ln?Sx~$IEzyAx&vj2|0gli$b1! z)s8>lH9KC%aR%7&hLChpyxtU$QO`bX z#O20KzED^l$MH`){)Mv)c>_6FKUADCpJD1iIHFNAw9O!GlR&wBC@2TKP9s{nvgG3) zw22gUe2jlHjEL)_G$MTJ+Jd=$d96Yd_!B$+ga0xV4n%n)x`y^cNc&{iP=e`o5_UF- zQc%28?D!O)F{H=myvX)*I6V-zm4p=PlGREeVjP^&6J(j+q&O)Lo4c#sPZdQFlZ##% z0&Mt3AgHihPT^7-4?b0CPCybcixhVTf~r#`v0=HHUcPn8IEG1azNGOGH`&PePLD>eE*=v%5V;LjKwMe9#jl5nS3@vI3 zHq)pezw{e4x&w-PL|qxBVfH|%sr18?l6CUxY6`F1*q3pn&9JcIr$kk}ajk`}aD(G6 zYIK{T;|Im6ivXmKc7>V|@3Ux_E?))Ru_P4}vv1PCWRcPq(HrPi-e2)%Plc0y9L%NP zKrACeT&8Ge1{3px-V5l<11tT&04C*4-Vc^19fZkac9`8Bi^JmfSRGckC&iKC_HYMx zAAq!%NKIHs?{pFbz7bZw2^0D4SVS;82_;eZ8kW$?uoPd{kFjhcE-RhAxeKYD1F*Ft ztpj$)pbn&WU~u(hM@9#R9K)$7+C}hoI0VU1Z97bC&Du7Tw(ZCgfZ%&R;>ld2qFlR8+Y?kwKCXvhqoa(vUk+nT2gcUqcf!fA6-Bh6!EhL+ znU(~xn&nq(N{lBbTxFrHBiqp7e@7-eCTLz>n81~+jNocVoR=p?B_wcZXH7C>v$+Y# zensX)8Fh`4?3-=am)n87>3y0wnM}+iWnFP59-8dP*G!ysS$(X@CQdO7!EIN@SkP^V zI5)|VfduNB-U4-59R`-0LT-HR^qHHkHY!!KR?_ttK_z_`viN3<<#%HNzXw6S1snOj zIK=P6Ilhfe;oDg)zn|UAcd!k7C+p%5u#@~jQ#yahRLFOmmh(qVP5d#_PQJ(V25&Q+ z<9p2$_~Yg!ywiLqKd7~drATG9$ip%$hlLf<|0ccx8D>)y4p{=7cEjy5vY00$iz~C-aL|y#Vwgla^ zU{sRs(P49gw$-3F#-LR(Xmt!)6NA>$mS$9saI#q8Y{3L7oTrh>pP}M8O2u;wIs93a z^XE{@K!37@SpPFDe{&5f$SvQK5{y1e5+6agGYhgcd4E6INj{t%X!xGw9!w9)c9ox|`OS WwC<&~nAT2OD`-7L>)&ZbhV*}9k`P7! diff --git a/build/classes/me/blackvein/quests/EventFactory$MobTypesPrompt.class b/build/classes/me/blackvein/quests/EventFactory$MobTypesPrompt.class index 53d411a2a4c038daff579d060ee602f60a95f766..4681deb529833b088b74ecd72e1d158b88cbfa2d 100644 GIT binary patch literal 4467 zcmb7IeQ;D)7609r&EA{M20}_Gp-^K9CFE-xtSAJq%@Qzn1A&D^KD55wee6E+_Px#9 zw}IeCtJbfgR&A}?)~{-%Rck5IK#5XXT4?F_ckye+KO9HL(HT3AGu08#eQ#4X$-W8w zXYaZ9cka38oO{mizU1uxj-LRq9Opts>g0oYY=P>|Ayz+O4-6X*|N z6#E4}F6W<+8lM#Sl)w!FHwt`O;4=cB6}U;@a{`|i_=3O}1->M3v%mp?FAID{;Hv_+ z2z*W8>jK{pxK-dbfo}@jF7PdZZwq`!8ooo|&JgaxcR9W%@cj^efFE+)9YQB;fgj2F zk3+ZzKMCO=?v=~;3H(&<_?g`PbAkJ-(ScuZ9O8H|gtf?V{E{K)Wb}N~RSZ|evRWiz zsL7!bO*bRM1ugI7BRwOU>8w|ij%AN_k@jlc)Sa~qOPXg^UpBxHh*~L)VRlS6wT*>r zLbJE334>PZVpdW$22@*@^WtJaI>Rul&q{0^&1w05+sft~hH$TGYIf96^LdT%&Kb{c znrwkQuSsi;XKt&uk4$zq$1FP?Nfd^LbSILu%n{AbtB!7&`AD>6MzTX2x|YTEs3U5` zP|b8C?%2ASCZnA8NtB`Eomr#AWUT~+QdiDwwVF(7Ij7gm707h*9eO(5;xd2dyp&KV zjGPImw%x>V$3N5YR_a~|!JMIv zYBs}yQctL|bZ0cu?_#7qZ*oac0Tj!krL6tc)4g0vR%+r7)o`Dhb2q!?euU#8Y8z@7 zjscD_1~BwqLa_4+QM$LQnH|VPAO4Yr#Wp1zxEh|k`_o?Zu8Z9K;vupYa`HXE@+2TQBQ&KZ5 zcUxt@o_06TxWmdObaw-fXUG$|9**k<_3UmvpOMp0d`L4ir|3r9(6g?7Rot}p7M&Fr zg5>exf}V2s4d{lUroGtspzb7HbAqIdw-_9>jNMX|du~uVAD5Y2s7Y?@N$JFmam|^` zI2=d9cmk&x=9kdSq>86hC$p)jYEsBlpkbWBlMHj+o1W52)OK{SPvI=b(_uV=XE~k= z<9WOg#*27~lB$ioeSR1(*H^X=huXDV?5SfYcr|>94%f;-N zpzSI;Y(idAl7`7_>#^yCUYoC88CGVfo!S`mkj>~K^=U=3?At}5r7;wHv&VguCGK4!CXw&pmabi_n5>5!7FOt)Az)fH-rDrizpCMt+> zGApk+aV?*x50iDOqfSXqQL#+%QFT{r=~+kIkf#dmBMU@wQ;wM^5z=ie7isCcghu)z zzJ|V#S#7O+m`Dmhk?#~3dT4ev%@i6#Ev*khX*r6D2Wh5YJ^cnr2YehGNDfOGA$$|yFyY{Vw&;>F6p(2vdJCBqiPy}o95l6DpOelNw-ei9uU+v*~2P*>f71LNqVUSGZ{ z&{p@JFvZ3qoeS@ua?{5f< zVdX)rX`e(I4K8VrL1KqhGK*brXYpaIR_Ggf&GwcfP>zBfx{0%c=WiRw+TzLwWS#>q zZ*`!W^86gcyNHZea|DuDI-oncBuYO-K(b{Jo=W@K17d!r1T&RWXXa8lV%D9`5_t?kkf1M0D5U9LnCSh{qNxc H9ES3LM48AC literal 4360 zcmb7I?Rykg760AICUdfxKnNs|K2S51H$45MOW+Qpoc|yPJoO^%g zoH_U0^E>y>zWLv)*8%k7FG&obSkFIB68FGWQA#2Kw;reANy#S!@>!NYGjjS2;Vfa6 zaE|aH!Xtza6Fx%tDB)v-j}smxe1h;8;gf{N37;Z7L3onz6yei^&k#OK_#EN$gf9@j zNca-r%hK^z2u~;R44zf-Rl?Vjcn)7z@q7|}a0%a#<8LPMExeG#w{c!he~0j0Y4JU2 z{(ZuQ2K3+uDt@TqM@bB#sNyFAbwR=MJ9i3nj26vQ);4m}Gp6OFPM1wT@KeJxrV|`A za)Im34zl(>%dvv}0$aOQR^NVHAdz;bOo7#-mSc{Wi&@h<*)HUjQ z`Bb(%J#7W4oa@Y(o^J$}>-eekf)UFB8w_qAJ!Q-oDcf-JsZ8KmPM)2rY$s8HzPIO% z6H|1vyp-l@ZX1kT&MXBZPN~eUb8j=!!?t($vbQlyP z0*b`~@dCn45@?O|%YkL5c%!GysZq-h*lDd5EupSt8?&Y-(7rGdt}H87pW|;%5R77`cTCUb)V84azE4 z&N6|Nv%3U3Z^c9)nQ_Zr&OB&IDy&&ZvOZa68t%orHSEW`q;yeW{nFwaDqHrH>8W^0 z!zH||;T62fZhLhud|&U?lX7NG!)092@ETs`y%;ir9Xi+SkZqhZrKF{e88cI|*pD36 zrwdkY+H|B`n|9AcbDn9IB0M?lux8N+6&l0A0nf<0;aELXF#O2>Aul1IGaO!LhaR}PX9i`@QSqXNYxudqh6U|t5i_{!MrK^a8h(N60_(zZSi(2v zrmo?acwNP>H2fOBQSn<1zr!0Eevd!!2ADGeS4YTM4S&R&8vZ1gv%&Ip#|=2#8N;@w z{=cp*8s5U61yU=W3rm`Q!mo0!>TV!>8Sf zAu^e3x+J;vl~lPmPK=Bn4jb6bBPCrhg0yS99`~d=qf|1TDS_Uu1x@Qn_LP~ccCu8+ z&4!EgE62|Aljx>C1#YCpHPW?QQHC<{z|o1(VHQpdkB%OhWCHQYc+mAG3vN-Mi>+2n zE+5$JsmVNDHf(<+@3@|sHhk`6Een@7AMQzRCw|Gc_$b>}4X=9Iv{y^|{o$P?invnA z0{zu|E?h%}OiWrnZDjRx>>Fd<%TsD~iOCtv@+;<($uC)umE|6*rn<(M;w@j4lld*@ zoUHQAAY=MI-#88!fw3ex6~!vm!WCI_boc=C+2@iPV-MWKmb_*@^~a&}<@FxE%!;Na zd7QA6fFe&9@D+$hyLqJWGuhqqDwOWasCkJ;3ex;r$2y=I9AH_KGLjg^d-%zxC+>?p z)Ldol8lZ-*A#vg|YA>N~4r(*ap?(g@vC8ZY9$rF&M6_6>F&0@Bi>!`CnqrYPu}E_) zvNjf37mKvSBCWB=`dDN`EYcQ>w8tVFW06g<$ZfI6=2+zRSVWISw!|VGvB({5_H5Jwh%rKO+8|!)E3Wp_S^flajcP8Zbo~e-1YCH{2>*qSbhdn(%j8 z!`JC%(N1f{ZdxbCsYMj1RXj@T#q+d5%u$>8E47P%&_*Reo0QFTo3fWSD@W;e#U@>O zoVF-0P=|7r?oj?loytGy&XBWu#LEh2nV~q0QD$wc@-K{GoTC&tf{BR7;%U~d=h)Bp z%%S^r^o;LlX43XPhbOL~kBOZcNbG3dIfq>XwQaT6_te$wQCrlOy7MTs)wZbp1Jp)W z(EkQDwIxF73f?h?-IG1d?`%uVVb28&^e*ZUZL&j1hujzLlKI;krFB65Lk*gFc@6 zH}>4%FcJ%OfF^LW&PQ9s;fJjjb=^IjnCgu>+;m<<)Tm_>FL2wJ&ASd3PO%3C(>zjm ck%#!%&Os0G9|Q+^#^fiOi2oZnjUPk#AE*0)GXMYp diff --git a/build/classes/me/blackvein/quests/EventFactory$PotionDurationsPrompt.class b/build/classes/me/blackvein/quests/EventFactory$PotionDurationsPrompt.class index a3baaa54c64133dfc1eb6a838ebfece0e933cb1a..68e67569db3c39c31a2cb0c5883f3600b73ae3af 100644 GIT binary patch delta 1425 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 j2Y8O>g|LUsa`Vtit=NTViFbm2A;nGKwt(> delta 1406 zcmai!U2GIp6vuzFUw7_yYPW^1-3l_rRXe6ADi}QlN}~GpDnK_L|MQF#m*B) z>w@u7#gmF%l0?WANr5YNmp%!;TiZ&T#X_#KXk||+6Pj1tYq5|07Ee($Sl{av+?<`w z6w(>b9(9JibYX1J&D(i5>*Sn5+8eT6C$-Jac&}+hUv-6fasF;;_XLzw(#ZZ;(jmZ7)->hjOmtU!kzg@$5Zr zF4JQ1GOv`jhL`re%4-&{Q!1LYkz71m z-(0CL;n(L!>ytG4^~PuF{gBH8OwrWe{yu?8jN^$=qqHDVrg_r@OOyJ4Xy*N!rdZ`U zsEmo}!H$OciBOp}!O^srZibcMWt@rn&q`oDsh^#3zV{Wj!a{AX6LIj^UszEOF($OV>x%q z+*SzEmrOH7KlCmMT`5Ovh)fHwspwVQt++?AN^!4ZwITBQgLQIbOjC>gFNA!=P~3Nk zp5F;yLP>jCg>y#9E2V&-s4t4VgzE0K%9Zd7Y1l$KGJ-I2@z$=YotkF6b6#irVJ~y z44WQimameYC{jqVmaEkd{?J<0-_V~?s}=1tGtI&u=A6Cv*{}2c?sMn&qF;&=zyABv zEno%L9Lm{i%d*d*k~T%VgNHVo4m!2eWf9T)ev590=ZRXpp!EX|J@o3OPy5C!4qCKm z@sLHo!vJx`pv92GiyT%AI|OL6cuDIkkLdNNjy|UCFIyyZ$SXSjRg2^EDBv~43B~IU z73@{KIWbmf=8EB@;w?p;;*|6{`G;9)ID?X2u}$%I((qiFAEwG>86lT2?<6NY#fj4{ z?=tFghW8B2>Y$dA28EHKNMC$YS2P~$Z;ZvGvA#|F_eVP81B&-uKHx(GPp~@ZxO~J} zDd_Ss=UhJFtjl>u4GcN@R0~VyWZE5x-;u1bzaiFpP|!H(@);MTY^=Y#repBHfoQx& z>PO?lHH|&(!;yXiyR)}zLwjFmq(^S)a*<2Pi{6r!%Up5!T$lZVt1e@FX|NzNl&RA+ zd@wTL@)cjZe51Q5p3}|NzM=M>Xji%;?dkF@-zmloRwQ?+;N%)#z%WWg%(FMddSd;} z@n}!-kUEvN`3FU<+1}pQZIII)i5pZTe^cd?f2lu>xJT3W|La@{hH@-UAGJnQAW4bQ9u_!N&SHYheK zHW`A_EE`dG8Wo!{6pzhH5`C1I6QIvbIgUV@(OhajTjv$v@72JUWr6>Z`%GpiZw-Bqc@yLMh!U<& z&rp%EEY;L#T#?^Ap{4@Mu1t_;hbXbb!cjGw?Hc(uEvLg?#i+fS^J2ejuT62bNABD} zJC6(Omdx@op=_Jb6XI}+GM`NGV2UzD2`AXj4k;%nWyu@Qkf&`sQ{>6#>?%*tD1hz~ zS3TP4&?hBSGh3&bt;Whyq1dfxQZ#FR|6!GI^*431(uZfR59A`l^mLjr83R*F$U6#! z1)90($sYnN7XNZaST2^QWGB~>Pw)tD GVEzYpC?P`t delta 1549 zcmZuxU3U{j7=9+%?Cfs08qyD%Qem2cv`s&-(o*VI5vo;NKn1auQqpwWhSp6?HpLJZ`^M1@c^E~g&k2OE7 z%G~+u+gkwIaK%6fgE|d+4Xncu$36oJhI9;LzqBG6M&ulo!>9oZV{#am2@@J(8g@zZ zfQCr}Q+S!f)(|(4z$+X{1C4;42L<6aJ+7y z4uc#=8B}K?mRh@kA=H=c=H=NPs(Jml-&OuUEFCeGpn1Ecu+(%9W&J62L83iXy-FPxc#l@ci{5lKdzm_076NOVHPZA*;I zh=@of!jY)eB;rY7xz(X)#Ex21A>qVD(sI&C!hg&}79TKFWiNTFx`}{74&Bwnhd4*5 z4@9OTt!XDV)!G-cC#})GSjr(}!o)}T*u*Ci?0H-;aS@+pfAE#He}>OZd?8VXVku$A z9l|mlnTn165BypamvEV(t;lxSLbDoROxz_uJH$^dY|?&Z83^i{b<{=7@0TQ#rNBc> zH-Mp$RvT&Mq1k8*e+^ILBD~jW zlz~O~Za~d}2ecgYoC>4=CQ7n*jE0PP8+FSmrIZq+Jd?5l_sCQj^Y8`kEtvhYJ~p5K zvY6gP&KvN{T~`$1*XTU2i?I?u!Z?CTJ&G266mgo<`nZd^mvFUU3m&9fsu@&c5bfxo z!qwP=P3R;lYOxEO$)Zg#SG=6Gy6_NPuM#tO7>^Jgk5YU;lspxv9FK8yb8O*woDnN| zYy}ht3&m6@Csg`UWOg?Rq(bhEl3hn-^8lhSQAu&nc~Xj zyk<{0a9>c#Vf8$^nwM3P!pSOK?n{)fk(7%9<=>#zgC&Fp8oz>P5$xJ5CyCB3p|0pz zD@9RUQCd(!qS(;%1Xk!tRO=~ZI`uTR>Idm7n!&Js7$@~3I7fkt`mC$gUb<~3_Tfn) zT%)c%L}K-lFzb$xz(TnOsKQXy|fKp`> z7fN?fsnm3{)U*-WvIrbIIiBTsPAdB+Hj+wzpd(K>lz-*`e$Xr0Ew#%2T)J}bzwbrR xneqh{-ix$epqt1yq*C*}=)O7$$%B{BN^>>khv<)OA`fzI*bfFe*^x%7j^&u diff --git a/build/classes/me/blackvein/quests/EventFactory$QuestCreatorPrefix.class b/build/classes/me/blackvein/quests/EventFactory$QuestCreatorPrefix.class index 8fe2eb5d2afaca34c8540542ad2bdf7f9daa8fbc..a5326035ead8cf56fb2f3bd99802b07efe5965ff 100644 GIT binary patch delta 25 fcmZ3>v6f>)A~U1wv6f>)A~U1kKDMlT}IBjvpp^YJna}FI0 zIh^N$#YN4(WHZr37n2r|%NAGOK3#6uR~0Bu3iY1GddoK4WSUhkkQVL!~RtG=LWolFKRRj)3 z)jceSv6?M-xzi7QuT*sLsmQBms#{*PHy$n(O63c_R|vK=T&>6A z6@i&k(vno4%KM77L2I-};CT>lSQQLJf7BAP7@1NmrspDF1Ve_?Cv)o; zv{jHH)=8#5U?gWT-wHBVC1+GP7{6F8zN>v4)-WJev7Tg@;ia%miH*z=nVhBJ9nl%A zxc!mF8Ju{nNzNJE(eOGg@Ey&X(h^dZXkM%iG&4Od>FN?%bZX-dJ*MKgX)Z|Vt(Oa> zNMTZ>MNE&JgKUtOiVPb=d9`ms*ZOkluwd&e+EO2h&(SuSe2+0p`*b?2FLz7k=m_IW zr&BX@ex+-%wPjlO@rN>NVMH>S6_UG}fH7-a`L kC56E*K?b{7C$?V-CFB>bmB<#c#BBMCW1JP-A$A<&F9=zq1ONa4 delta 924 zcmZuwOHUI~6#nj=c4j&ZP+P20c?<=7v;_)25fM>*pgep_sftw)MoFu53c9NQVdBD# z3;Y8u(N=9@T)Qwa(Ty?gd`0~W#&g>VapC5k^PT5+&Y8*kSADrRe_p-<(1%40LG*j* z*{@*>1{567;KG0hgE%O(Ar*&&92U=EVLqZ_M8#1J$8cODd_uvf1~2+moKi5R!H<3o z6PQ$RTEw4Gakd5loKtXK!374{@+_E{ju=B|%zh^sh5T>EF4~XzliC)v>S#iqy`-L-+8~oN+&$H8NR8SxKfW!%7=>v!-RNnASo%YZ;m3vYDD6(nQu3 z9ak}<;~J)^b9^q-Gm&PHNKuf~aUC~w%wo=dD-FtAxO$0Fo89H=lyB;o$AUfOY7Uwr zyM8paoLn?#jr1MMOsCp(+`?^2?63>28GA`?w`1;U)@2vmo%RE_W_x7Qeki}s1!=JW z^LoW(q`AOpyjCz6gmw|)B(-ql8F;t^sX&OMjb52zz&{{Fx-N8RXvbEP4BN2Xsc?^? zC9?IE;fj~wUV~hO;!}(86rqjh9CMWL8ft_~cU;jtrBz$ii4y!H0{jzV{BxzHQ7!AV z6ralugsEwO28kd_nG9X%c4(9-TF^*DeYHi@J%T^-9Q9@7yz%f;@DeuUqds57Lsq|I zY{*B7*!UWOb@H18!_8HOFVM(QM$idng0ECrO$!v_`vo5U6}9{u#eGMJ|3EkYiAnzJ zAO5+-`Tz-M03wN=$^bDcNcU)L@Pcl#(-~#N*{B?jl)(OfkLq&d_1ZFBvYGP5)plbK lRp8i5h=;Kcouq`QQIP(J4s!I8gjc1%W)LR{`$>+2{{>4^lgt1B diff --git a/build/classes/me/blackvein/quests/EventFactory$SaturationPrompt.class b/build/classes/me/blackvein/quests/EventFactory$SaturationPrompt.class index 5ba557f459122930c1f171a6837931f2152586eb..47028832e2af57e17581736ff3e0679b32048c1f 100644 GIT binary patch delta 957 zcmZvbSx*yD6vuyex=d#nrHqOqih$tKYO3PC;Vx)Z5Jhn>GS-pOnqg|9CiX+jtHwuP zU5iRYqEBw|!9<_@D#kO=5FgAWmi7`c{>GcqG)2X#gJ>O$r85d zY&VIr&0q&RLv2@r-6nh38yel=wa;Wf2TTrfNat`EcqGBmI_A@(b1cDelPo8~_meuO zOd8pu)31p8H{J1$4T|>cvwO{2;Ia+yM| zn9mIOo?FZxD7%Fb$J04uah5@gbDUSSICq?)e|W_8OWuIv59Iu^m-F3HvCk`w-S%~c zEG}>{jJ{-XnJYS1Ev}K%8Me62h+;{}%V&mr%A=#MpAj(EznkeRb4w<}Nr@IklW{GR zNiG*_vsju)GnIaYmYN{)Oe~ESx#JRp@s1UuTcM6gD=S4RI_Rt+oTwo*O%ffNAoiSi z72Qs}#;9UeE7U!ejDHb7%pf+-)NQIEBJ5VNS}>!mVQmfjBM~_;ysnC+J?2;_AJUbs zGH;ssa~12uipg3<>fX?xF^N5tdPzl_Ks`;{3&PabEUdEV38vUev`HGn7ztS%l8nr> z-GVM{et|tD>I)FFGFNgy#o6b5e1N(~2{kH96Nx46cH#U$4? zV#D*UQ?M7(?qVVBX7lrQ&RKGD-FCiUAMCN+yj^hS@=K1Lb-fceEN*hk=Z2SGojHnxlPcy#bD1ZF1U8avD2WAva{@euGwBmI57R;TcAoS{WcbgVVN#yp^zt5 zB0st)ZbhR_vR=t_@hTSogdSVNwu(tG{A-f& zGS&t)+jO-aUELPl7eYGggr{O3(bv#c;>AeBJNKFTG7axg@km6IXr0DNO>{*#e4B#X zF-2pTpsJ@%HIP(|a{Zb}sa7Uc`)23%R!`fV&r~{>J~=>4bj1ZPfN!wQ2tms;4psCF z$)2ajh{dI||BrbK-PlGqNXSp~MsJX$M-X&*JKjW(&>_A>5X15sY+30RPbesNzn>KP EU%K>!l>h($ diff --git a/build/classes/me/blackvein/quests/EventFactory$SelectDeletePrompt.class b/build/classes/me/blackvein/quests/EventFactory$SelectDeletePrompt.class index 9b8ed302d26811251e43261d96a3330f72321732..e572510c23a543f53fb929fe710ae18dec37cb3c 100644 GIT binary patch delta 2097 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 delta 789 zcmYk2OH&h35QV>az$BBaLZSgdZ~z~WfXGAft-MsCK?G65Lx?0m5EC2*WMgIH575dF zVDG{L#YCjal~q=`@dsIDc_*YOH}~|p-F^CWe+(4-*lql+GTT)gBymrbs4)y-Y=a-ADKZgR^Q)RJJTR#yV(?Jeej8Df*C}Vwau(x`l}a=iycDF#A`V!eN7<&yezuCi?X^M|q-H5-uU1*M__xwDKkRJnLP z3MVD&mQ0mshQeP^LIu=q$y6-)mdhISC=D_eZj4DIrzI+!;cQ7EQc?)+p~VX5pD4>y z?lY9b`ITUvsy(VpiQ`*xlvdok zMsAKC!=q2qq)*YSPZQN=na~qO^VYtt1M~AG^U^AJtW?#=!9`}G@uUOd&|L%*Ar z0Uh;-XgIAyMZ}FWI4iw#E}YkK0T*R(NiKsrhA`|TIDL*kIz|wc+b_Ftr3zOus^OXo z<2ojAT^1)b+|W^nehoJnxV4yC*;;Q`TrmbPjCO41TI`?7dae;cfd&Kw8gYxEZYjPN z?@q_fWOvNUrp)BfYAT&DvKpoZZevE^4rUpG#+qST(L~D1WTU2KWMkwkkE~|nRw`p^ zxGQiE_vPj}fd_b~VO}7PM;aCc5-DMbnNjATH{81#hNsYn6Z#C6B?2Ni%4l$ zV(7DbSfAai*6e>GkjAori3~%S(rxy0b%_NxH~jA5OgfXDwo+-EJLifi?Eo?NBE{lSX%;> z2?>sNbP%PAW9US##Ql~+2f?Sp1qeU(y?BM5Pyq)jtvs?-b*0r8copozH{1Cc$~IU& zGF4r&Uh-9=rwa8PP;6gAa?9vOd!D*hf}{s9r5N0jHbiXxj!-76xe$|6Y-LI~3l zx{5?B;sK4Xr#zAoDoEM9Gejb`$ov2NrGb{Hd4-ze1YLw2GN(VL>m)%G^cA6}&`P#} VD18`13+0cKg~vtjeTf delta 839 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 literal 3777 zcmb_fTXz#x6#h<{o|%RLL&U1!WvB(xONgzAO7Q||tA&(HQ^25t(`0OirkOG`DR@D= zf)~731rn?JziV_h!ynM`cj23pqgp|j8Iv-h|6`Sw10 z(x3nN=6e8*I9-7{te3Ds#zq+(G7>U616YPl5;g}QV@n0@MN+J`%D7L+`^Dn{8QTKb zjt9lICZkKplz61YLznT8kliwRWEe7b$mkV{jEp`RSsA8;ei=IhP+b@ z7Gbx5epuK)BID6ncno_aJRYD__eyvofCzTWcuE*OE#nyp&j#oyw6&jsJ3WS7eIr9v zyibpIWwcc9fNo@?J9E12*wK~&J?pe;DaW)PZX)ZIM%HldU|1BM-n?crgFj}bb%x90 zMpj>!>+903POU3Lno!(KX_?KMWr%lA=@-c`%t}zWz73Yy*Y7YWZP~1D#WI?0>$JIa z+Q8LC?v(TFZr#aab?UnbZ*@3sTHVpETyL-8L{nyVK(}noG0dzTjTODo+98Lgn)nWF zK#OLyYIF6*t`ti2#M0Nc57z5LbD>P!Z^V@n$C+s!Y4q?=nUG z$1qPzrSyJhvz9T^nxm)Nvi&&@vL1th6=KXWpvF7Fi5m+CJcr-6M+@HBj9{B zWE3o<*z934EGQABkO^UplOuYK=$>M(;9a~Y;jn`D@qvOP_>iGtx@(=kE-q1pD;FH+ zF0T>=_*lVF98>U#IKqOYnN$06wj+2_HIIvj49j*FN;t0I1Wq#4&n)(Mj9VF&&CI93 zS|R1j-IPmfRk|OVniAE~(@Pb6ic<{NO*(-sW{z4Y@WPo87qfJ_cdU7~fidzn)Dq zM8ZXp)_3jDQ>Esdcl*e3g1tACrq0E2d)YDbRy3x_L_t7&cNG5Z+8RD@{>r|&QormUldTBv#^)>Iao+Nnd^)lQ|+x-WD% z%7zRl)^ACP`W5j~=t**|Dpi5vFHLm={V1xV-(Ua>2E`YLR%Ku`vu>s5ZS>ZOa{9Rh zRMpm<1*?_5gD+VYDoZ5&A%7xS9x6{Hd59;@LHd%cd{{xxIfMcJD9ZUBEaZF9L^_4= z2n8!~CrO68uqq$H_bXZZ$#vx@jj4Onq(sQ5Sb*0$3s?^S8yz!ztqWb}Qd3~AG&O$Lv51=MJ@@0-mPa@bb=^hNn*y=W#T4m9 zMo{$?ZgAfxBzIB3|C!$UA?m3zxA#_1_kllyO8zXa=ligU?}y2s!!iCme&+{R1Am#V z;IA;7zs~mXLG}wj==1YKz7_ni+o!egvpv{|)rg5M_O0|fR;-%QLOomQTZ~rRO}%~( zMV$-(-}qfZ+ZYDNuyqW*)XZzJHs9QAKfMtQ{;C%(T73w?Q7lT>4;^%R z*+W+$5u$}WL3bg0iD~nsMNc6m#BF-LBN*3n{dRAHv}#`;&USFFketddOHtQ zW0|e4b44NQ9crm_2=RR8SJ%qO3l1-G++l`Ym2^IK|5fcOVq- zI-J(MuP|znad?$87H1t^<8_NMhjHGpc+=r6-j>M@@9?g}d%U0NaF?XdF)9P<0v5v# z=lQ_lLna(P;<%zbIv7o)8Y8h(U$QZgiYD8{>D{eYu=v>F6Fyax_9eT+dj@)XVyUon z$5KP#o$=10Xj0+n>WwsXCc2_=htK%j;S0W06h#M9OF;Dzhe@UsN+?e2p)3A1bX#Ju zGaifNCpuhUCeu>zi>k;}S;d})zIb19S1K0IbeJa=a{d7c!#g??-3nKCG^JRZ`Py8Q z`N^zT0ewk-f(ymg0V7>4?+BF7r)3wF#YB*2hC%7jvJ)bN+lb)MO4}% zOgC|>+!Jn#ytTKP+k|-y`=sM`QR)tUafw6 kCQUR8g28xWVXqP&z7H32S+ge0jJys9RL6T delta 1290 zcmZvcTX0iV6o$WZlAe8fvWp=q(pu_iEnbq;iWU`Alu8{zTA`@5-bNvjaz4p5NYyJOObAG7( zd2#OZKR!MNT*3z)&2&}Eag)dSY*1|U2(qD?ZZ;X~W|v#ceXH^G80$7;^?KaS9U<=I zt`K)~Pl$WzGsk8{B1D9Km!!u4TgLbC(wX7@QNP9ajBi5osEIztKF#Aiq1dlEz>|unG*9!4;#tjeJTHwjd0x=G z$V(RCbY@HI=CPrn!E9>@Q1deTEbO?i*rj=egPKFUs_A)+y%uXbQrTq2@AG$q?^;;C<~=h<-QcL7N@rz|@xI}~{(p_rsF~vZ z{Hm&7EI+@x%FnNJ4&<9v?8A&2w{y+14Pb@CMq9Ch*dlNYi@3bn0%1aSwb65swgg1xg;&EOPJ5w}3~3|=9JDiG?7 z9>qS2E>KfsfklziEV^2Xge?xzD#k*K<3v^lD=2X(uMHMC-9oI$8FCnysXxDp2PAf8 zfkmD34bPH>rXaGooHi}v1WFVZk(1e+6VyAO(&2o@fb#|0oi9tA+GOqy8d%O{qRKM4 zFXsv=6fPB>##+HjVOmd$E4fOPxmw~2uzzQnVwK{W-%3hc%j&Wo{3=*M$(e{1s69@u zt}7lnyFmRRw*4bQyvP!p6Ewym4gd94NS`ysik5kbM$-~SUntJdXe4ebvn_J2%^c0W z251&*dXA+P`@Cs#e@oGT5+%ODb-rbx^Bv93_q01dGVJ`sPUmDvk!X4HdG-?(_QHnt z5_^~3T*n$w$>>mxeTsHP$MP_;R5w&4SR*nS8J%csHi7m38|9Z%=6gA;mHjkZ=CF<% i1;S>%ylgt<+aSM@fc)ILxmY~c%T3so|4BFZWB&zXWAy6) diff --git a/build/classes/me/blackvein/quests/EventFactory$TeleportPrompt.class b/build/classes/me/blackvein/quests/EventFactory$TeleportPrompt.class index 6e6fa356fe1a735d2f53da23daea81e8e1329fd1..7e94f39ed87a3b8d3acf8125a61d6bf8cd90542f 100644 GIT binary patch delta 1230 zcmZXUPf%M`6vlrq|K7{ZD}+EHA0?Ivy9XR?coM$_rUd?J=fWT#`}g?u_YJy1+%rc!yG zS(7X|lR4hhXi3edvW4NPbRm}?PZf@(GO4*-zA%>0&CV5c@+M~}*w~`UJa6f|ZSoFh zHG;YPbnH}dW+q*T2}9bt;_^lG$ptQ&e9R{%pR#E3899yc7DbsC#q*f*~X5FG1hPTcI%4Zmpr$$ zh~OjEmwLa}Y0Y|eTL0*`!(r*Rxa{}azDnf6A?CJ=?;TdHH(ctJGmq@>{>yHOO*=-> zMO0Re9(rx8#3PdFkTtZ5Yw|koZ}61S1I7)!WmFm8vRpdYB)n50Y+O&O5=uJv6B9~} z2Y8TDgKCnXc_Y++eUi=H5K04C5qkGa9qRRyF#6Vn*{n?A=giIgp-l-*xNJig}^zMc+0GC1+-Fbqk8Q(&I%sCai(qI)~P yK1z{w#70dI{W5~~czJk|0m*Q%d$5u^M7ONXk`R`k%pSRTLRS2S{5mF>#_=CK{Nw2W delta 1294 zcmZ9M%Trrb9LGO5uNzKoTOJw&N_!hNrjDLtTI{wZjWvH9;`~A-Op6~B@&L7P`G*|BY z`~8o=Lwu-cHk8qCj zCKC}FcrnbRVv1>vd`X|oXv~E$FGsMLHA$MxwJF*-5oSJ2+GN2X3){;zh#=&-QaXAvXg{_5Xd$y&TZ&LYo6gU`mYiy5aUmCvSfcClb5 z?YVqWRHtY=>3n*rSaNJ9leU-g$;;`IY$vo?u+s%c%-DRfkdA5aLbi}CXA-Jdx_gw$ zr;{b`%+ov;O?kxQ6eme1TP!4Oxe-ex3#oM81DDdya;c!BlcmU#$*UG6%5Ha{y%Ny= zOdN}4E?Kn4{i-r$Nsv{+i~om^dE27G zRf}u9WAQFmEZ!q$uxGNkY+qb1J9b&Fq@24|*(GU~%FZE+_xZq}R|>w*%^5r0aPX80 zdTB~SQf@LhW!SnK?nZFN=y7L4``y3%rh6lF$NkbA2>2J%&doo~y+)-~CI^iAdfg(? z0{Em)9T;?q^@vzLkt*K(Ex!0F{_A4-*e`2HFsNf35Z%%`iU)~{H0UN#V;HJ2MAr#S zt`fXKsEXMbu2NS;tyBcQoo>*hi+WC@H9CmW!yzG*j5)kXY)SiT7;9 z*{tJyU^C7&T70b2I;pu=F;>=TtLeK}5{>Pi<4z$qH0eE@_agUr$o4Hr1?_h`X1fdsG49%P09nGBBQ2p)CI1pSw2#8e5_J@q2~EU zEpSt1_*rH7P365J4@mj?rfH#1{*s`ye1?am;Q?LKt;%oIDzEn*<%skp%X@9 b$1@xh*(&%}`GvY<=cq{P!}9-}B!%xk7^?gq diff --git a/build/classes/me/blackvein/quests/EventFactory$ThunderDurationPrompt.class b/build/classes/me/blackvein/quests/EventFactory$ThunderDurationPrompt.class index 56985ee812e2f20c3dfe6d999a4a4a86a119cb43..e363f07158b1f373afe5685e35fe0adf90f0c9c0 100644 GIT binary patch delta 873 zcmYjQ*-{fh6g@r3OeaIDAwjl)5_U=0WEEGIs2~W4h^VNMjA1ZLs4(zimGKv>@zDpX zeDM*~3Mf^6fK^(4hUJ?-px&OOqVv#wmpI+x@!s$&e}D#7XV{LnFhxIBK@hbv{cib;-ZK1}PF z!F8FO<(Sh^g+Y!R44S=WZmG>Z42@1Ni|oBt72g5_7$)0g!1<;;&DEh^pcY|)I^1Na zT2JgGy3+|O)xBV6O)E9FZKjh(mSa)i7M28VW0|4a*fA_So;2-DHg4HQc49l5u+5Cc zaYx`T?#Xj20{8KN&_p~+|efjX>15s$S`y{-<62-%)7 zGqgIJYRmhyI>ek`-X`abwh<1|70@UG0ogoRUMMtydK%6NC(6UQlN8g)18+kE*+SaT z5kWKU3@vDtXUU!+q(XbmA-v1`P~Snzg9m*F@aLiDQMOA-1^)R3s!g+R#pv zUYtS)as}?UOO=;OeMC^fAwtU?AE4}m?M8zY5_*8+ zc~l;vs+g#jnmn$iO3?e_eJJDoi17h>mqUp2+=wf(p-{afa=s{%6d{Tjwb1DjvEcw{ zd_BdHOi)6~);gjjVvnr<`!5W%K&_RiHT2R&$RTU=vvl?mL_xm`9Y7Q9wL}@h6dEbs OMLPmMdg@c8MEMIgz=!7m delta 841 zcmYk5*-leY6hPOx9ZtF2V5wLXP%j8rTF|0a#1Rl2P!Yum6}3Q>CLI!5p42oNzrgFG zZ^kEIz@exlet?M|;2#(h6MsPCzHKG+;q1M8_Fj8B_gm;^W9jSP&tHIjESQ8y)X8zs zWGe%jLndAZ>KNp(s~rh&)Ro8F zVUOjCsYQE!X)#$$=W})>owKv)OeS4O&E<3Rg&x=Mn#FZ)Xr?W0a!YgDVum{wcbQTo zhO_ylT+z-h6^iz3%1##TOe!gQzg=at+mZfwJYK~H|8q6>ERxJRzdVx-a~AWYEbj9_ zvB&xCi8uvsM%kj-&L8iL>T{m>x|~U$`R=>VtDfs@DI_BW6%4u^isr?THrr5a7wdpn zhDb9S`+yN$#j_%o!45h7;)Bk!Q*_JKF|pYtQqf6QjWAv#gxBy+ui|@)zl;tA%G8xH zmrLTl5m&6>!j+`q8V*@cH@gMsB|=XP{8}uJL{IdVsc*u1@shq+nTGW|o7_CXYMxIt z8mtkTj=slOMJ>ldo87pNC7Q}?StDG#Xf8j~X2QO;~^zBH;jJy g9^8%W7t4_Cbck#bWJq3kyZqB9l3+jvHpm5xf3*61@c;k- diff --git a/build/classes/me/blackvein/quests/EventFactory$ThunderPrompt.class b/build/classes/me/blackvein/quests/EventFactory$ThunderPrompt.class index b0a1dfb61d80064be3299f48bb71f65f01c5a09f..513f9ac10fd29a3711e6028dc90cdcdd5ed889e9 100644 GIT binary patch literal 4095 zcmcguYj7LY75=Uy-(4%4;3&krN^ufHWLu76$Iu4TghY{32iYN(?I0+$YiY4JmUo@i z%7jM?EzcHcd6j3I?Ygoo^8J3Kk3|mHC@J3`@C1a0_ zt7Tjx<60Tl$@r!?`Ie09CEO517~c-!JGe0jA8wLxOAry?32;(pC8pml3| z2yt^bVOssszWm^zZb#FmF``*H)z(cT7may#w6;m1wJxzs9Z{oM)##5VZA&-$3Dlp- zTMSj6qlD=kNCYU<7}lJa8H!gyFXRC|W^ZxQrtEa6!%noQG#O4-(`jwk?p3pTMzys} zyD^+6v*{DO-dt;S^E+OMBi+A3FIWpE&AgS?+H{fErQV8JBci6@0(^zyG&_O}tcjjx zde+g?qF@6aWH@EE+~&NVrD71r4@r1f!6VqKU>|Pm zDEKLUMv1Cv3@Z3JenEw(jo9w_PSeU}B>YmrejHHnDE2Zy!LJ1Ruf^*(f*cQ3v-ziaJat84 zBFI`s!Si^5VTDJaBcHP=pR=GCniljbW@*%f9h#9ZI#e~6wR+yc)28pyGGw`^Tphlw zOk>he^@qi1J+quYF*9pgJ+_{u`q{cYv4x@9+sUy3)pkV0ELVqzH6z2&81|Ui-nUCj zmm7F)8#SIPv$Wl@MXCwk(7IFYXCiYMdU6xdWek=RbtIk2^BQ;Nu@ z9X*>EDznt2G^z76B`Jg37)~#j!5z+rm*xt2)vXVa@bd7sve&HAcIVY>uD#zdEiIiur$T1z18OC(-XR4(n)pYLZPc|LJj?CwbE}R ztEv(oJ6id{Xk2cj_l30UMg{$?0W0epo(8Lzo`Wyt5BZa+Kq!z*RfH;%DIVg<2}n

3>%R-!8fDld}V2_sg zJ==$c<1mJE=&psR9)iy?=tQg-mxj=45peW=uAx9#Pm94T8}I`dEMOl(xbuGmFWjPW z9CeeZpL>VTMgM=~DKbhW?{`|`d}AX0d#oOxL6Z+tXm<1`ux@k;Ek&$z35!BaSQ|oY Ot|xjw(Q%@vlK%@u*>~Xp literal 3801 zcmb_fS#uOs6#njHlG~Yd!Z1QWP-!rM$ub!d6d{QSOcD%Cz+?hAxL{|dNt#T$Lw8RI zD(>QnD=xV2xK<&hK}~5{K4_H>`s|Bu{s7CzSeEDZ^q5I9F|o>r?sNOzbG~!#cg{WC z{o`L>eFLBcpOm8k`#5fp&?})&LPA1+09Ro@$AJJO94yC;NQ%)R2{#FOv$)+N;nn~S z<2JFZN*E9_C2nbP(W3BzI{BVj~>A;IJrm2fNo1y%qyoB({ta*PE~ zi*W&cLg?Qv;f@O2iIW_61t`?JIqnG{f^iA=38nibJizf_fVM(Q4>6QEL%LnFkzrkY zM2ik&)YR~prW?^?SEkfE7S+)SyN1FEHqXK&Ikf?=raAIchO&AP!dM@Ah6x!W)_E0$4hTchQT z3%ahE0YGtA4r)#gtzR1_#GT=|X$?jPvcto=6HS@Mm}c3kqnm~ujTJo6*dc?qy7*Cb zOpRt#V=$Ut%h_9Sor~vdIf0YS`veToEx@=Jm zGAvV5DQ(m_pl0;6>S*b1V>C-{Q~z;$bG_BgA9#*O+JC8@^A<>$Su3S==_0R73oE8c zuqNYbY$l#&GswW2>1v^C6J1xyxCRe1teCC0GplE)7{u};9FNL)43En=jVGvxB8uxy z@$#)i0%GM!8BgJ9syc1V@m3C+Rwm8yjErY-M#gh^oB=YP7f>&V+lyjmr4msRnxh;S z+Ddq@X=sYAIdz13R;(*6o&sgwtrnrM?Rew`^xE$2l4A;{!Sji}gS4WedaR#aiXr z%Ll&P3w*wLg-(pBq(rW?bd!t^@eyTs)=r#UCsOhWU(3+EU_dcTqr=#v8QFX+!MRf# z=50V-`nZ;+GRzxShi@u!K&iQwghh*07K(?u%C3F!4uvhLb%kF_H`yY`-zEUXFR^|prEX8N0P*j-u*l1RA=a%QJ2lq zStizZGps7cdawJ^q=QdU_3I;~ygaB@g7QzIym3v zC>m0nnZFH1@>jr1z9z|ZU9k)lzI|$%>0_yZzRds@42ri9jY`0%du^fnR(k43DSbu( z>*^am2dn2_!kUx$a(PnOxk`jZJ&gcyomA(2uz?NBu}7n0#!W?p(PUt{($eityXzf=h)#Hfy{O{C;Zhe z(q$BHZvWrH=gzo$yWB%<2wmY)lV`3tHGbEyfSNU)`8nL0L--cT-hT~m4#Zj)Q-l|p zz`8GRrTaW1xPJxwpXqHpPc>EI)?O=BA9y*cc?H(+O8V=lqCbNrc$Ww9D__Q%c{OY0 zE11n!v6Fl?`-!jd`MKh2<+W~|*2B+Eq8B?66IJYM_bOJ5I?zcqTkTtqF6^ROzn;7< zh5t_iM)wrXOySTJhN+l$V^6NQ*+cY1F!-ZUlxWRa1Se6Otp5y*UBvqHjUl3zW@Gs( zk2FkRgGb#3ghjp9<V23*gKK;djprv3$pbYJ5K&4%Z8PlMghUJM$qk#pMoPO7 zg=mc-DqaHElZ)hgY|d9#k&v1TAPYez(c*=-={%dx$!>%wCyglQ5z0#wTRoHpANFD!$$IK)4fHd3EzQ)DJWet~@?MfHBu|liizI^5 E-_Ya%EdT%j diff --git a/build/classes/me/blackvein/quests/EventFactory$ThunderWorldPrompt.class b/build/classes/me/blackvein/quests/EventFactory$ThunderWorldPrompt.class index f0c77f240c7018b320055ecf114d1356c697d31a..ffb8b208981fb9f6a3d4e9205eab3228cde980e8 100644 GIT binary patch delta 1281 zcmZvc+f!Rr6vlu1BxIkQ>}n=pDHJeZp=}bR*lMe-S40P`t<_$nUMWc-HY5@PUaCZ^ z^+K(P$6KpatJQihv^9v#ba-;czWE>c>Z5P!sN*_;!Rq+3_qwldeQVGDb=i+K#q)oC zcMiCMDTijZ2IaWZVHMjncRBdk7UXWWd(sY@o!-66v)toJ-9dJ9ufu)ZAL0QX4Dk>> zA@-LbG4mQG`!?_$2g>U*>IRw zG~nb5puaCu$xhT%=#lHP{5Ibt}DOA+(wb!Tmf<9f@k)BLCxd87JlZv$yb5VC( zRl4I9=T!Z~Tvf0mm&xUK6w(GW1IGh?P3<+%E_mVRmdbKJ?M}{S^ZF5hy zPvPrJ6%;M*`9QOOqaxw{V%4}mSe0jv*h&?f<(0{X!eMVGBKfgoF$vjOt7z*)v*dPS z@o%tV)A*)Dv$$N&fW)8`Z6X^_#$gR>%Znr$b6B;^2|-%_?In?Jj05j z#VpO;Ua@J^=ocPc|P7F2yi=_ hrGmvBqFHQ_Ukz#{zFGdMcCp+lH(^_Tklj3m^*0y?><9n= delta 1201 zcmZ9M*>ei?(JU|{Bc9=!r$Nj z0Nl0^_THal!F`&MJwW~9fB)bH{H+oSB@$tVNtjIxW2 zSq2r^C~<}yaxTN{Hp?F4l6M$!8D&h-J?>C2K+!Plb=YTsl0(@XtTQv)}z{g%2tY`6ujC;c>+?{<_e~rUXgNtt`KcDG)Z`B| z{OsFmk)MuCxsiRXD9Zr#tj<28}%M9;{nP{4eh@la`6)CPJ~FT-jRd)1a8Qnz3|w6cObB-drK z-^pF#ClThO8)+qXOZ*lJ+{3++?|p(_f&CZD6!$A0xESQOiU&=WH35GYvasxv$vO*u zq&c06-&m*RI3tNE>?w4erqm1zZGNIH8E?JZI>Xf#b#6M%%Fh2)nv&w;UQlhDDZG8I z*clet%+k>>L^XRF>&z^RjUw{R|8}AkC7sxTqXxK2?V>{svRdWj`3-YGjRYM@%q4!Q z`pNm~r5IKR)jJ&GA=XHjOdlGt{}d8>R>Y7|KSD@);P2GeZ@+x1UeMRbCFTfg<&Kz1 lM_9-D;BGuBn$2S}3FNhhQn5TNJ26L|eIHL@{{uY>-p&93 diff --git a/build/classes/me/blackvein/quests/EventFactory.class b/build/classes/me/blackvein/quests/EventFactory.class index 3826cdf7b10007dca8def99438a3c4eae72b9d69..429ff49333a03eecf4cdab60b75f13690f1a1ca8 100644 GIT binary patch literal 17952 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 literal 18264 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 diff --git a/build/classes/me/blackvein/quests/NpcListener.class b/build/classes/me/blackvein/quests/NpcListener.class index e7ea2f8a16eb1c5b16fe6c00d7628bd88113f6f6..0f32b31d88d9b7160ff200b6b7c1f21e0dc56592 100644 GIT binary patch literal 7359 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 O5>7P?4{_Cp&;1%xD-F~D literal 5937 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 T$t;jj^r|R=pO^Bbwv^$QqMgdxd#QsT4^pO% zbqr7^%F=GOPsV~i>P%e%)RnsFKzD6jVo(o1l4X7BNjci;<)z+Ihp3N=a{bho`UR*z zwer#c?Odu#1HCjzJA<_t;-$+}cc`C+(Qw`FaxaZgwUKJ;DBb%CALUWL7FTL9T8lAS zj8&rwv>2z#<5hWrpC*QAQh+AYRa#ta&=enf(Nx{7oliEnM)#ZMrRmx!)Ug>dhl;c{ z(|y7DQ&Wn)bgh?Wss3yQsKiTiyfjzmm3rwqFO_*|o{rAf(d%`A1!_ZRp`XfWk)IaR z4SrfeExoi<>l<~^Wqw+&lAE-?Sqn=X^3yFUUZI}c>cg#co1bo{l`0mkTWqa6bnjIP z{%V8P_%Vy_)MBlwX88odyA;PzJ1?!%z3%qYdTOb~h5+3|8+{a}O@1jvVY5N^2C#^> zsN#Kos-Q}P?)TCI+I&!j5BX^;ZS&H0tsmA+9|_Q-G|8aHRPwm$RQc%%dNM#e=qZDQ zZL8>MgF?>)u!f#hDE=IvowO@JyQ$hs hJX9sQ6xe-4-PkYqgr@RzZ$zDJ0QxIOz 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 literal 11154 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 L5d&0tpCbSO3J?-# delta 55 zcmZ24v|eaK89SrV*_TM#F>o{4Gw3imFqkqqGT1XYF?caKGlVm_O>W|d K0jj*u5dZ*%4Gk;+ diff --git a/build/classes/me/blackvein/quests/QuestFactory$SavePrompt.class b/build/classes/me/blackvein/quests/QuestFactory$SavePrompt.class index 06f559eadef8b1896dda6d8b3ea5d5c2bc324f41..3946ea7b28e0dab54db6b0b4a65f8e739e86e091 100644 GIT binary patch delta 719 zcmXAnSx8h-9L9g=T=m|$p2)%oj9^Azf=Hcuih{x@=piFpz=w*dCLJ4{@{Up%%!6h7 zdTrnLEX&mP%=R){&C>EIvOS^&Dtc%+Q!nT6{lEV?-}nFXUG{bR?AG7sn}NY}t+VIG z7TNS;wndf25}TzgvsiAj!p29T$x08Etg>0n8jH0y8LYEek84pKzc*NHv`Ju7GMm{F zKepQX!L~TJ-9r&OEOwggvKhi|4|~{avCm?^$pMptf~08u&pR^hkjdeHr5ckXy4~cc z0KwP+t`O<#6RKjhg1$w8@<3KNP*RXJFQpVy}K@ceP)q>(0$Nzw>C95Wmum|a*#~Z;UdM-iLGQY@-KE~ B!R!D4 delta 697 zcmX9+TTfF#5dLPMoYQqtG#CO*x7SExgq5O5!!%s2ekZGkgGqKsR25FohYfqe_zy{3WjS3cG5f@<@7sJb&5Ml$hT!IEJ zMF*FmoBinH07f{72@YYBBlyLY_|4lWnQJMP>&U~~X*Ji=THZnd5Z;md zyDGwXFN8}WydS~`Ds+s=B`KGbN-c(h4^`|&zk&$`rivy>P6<@G6J|ELU!XZLZN$dX zdU7gnm{x2iXJp-M?6lna^`vV%mwPCE#I#KJsKCCKjm2Bf3k2hK$`II+FfC&!H$7%J zXZ5i(Pihl(Qcs`P9aHlDVNg0F5FRnoM$+v|neHjap3b-e+JI#lPCTt=vj!y&Y-l~Y zS_i$~G;a6`&l+=7db}lJJL9pj+|-om#*(&`H=L~QnzogV#Y;HSE-&=7CMNZ~9!u-i zcx=RVOlzD<#f-qN^6pR~U`7SD74PO;GaVan4M!)U{HD;V)Gg5UY`)Miaj0F-qfH|& zvpA?{JX95=6-*1%=*gs!aR;nSj@FXT82VZ}t>yhKCXLZmn$jAJRe>b{fq|zeoAOxt zbr|jLk);)wW7P)cx&@+7b45TMv2#w+=r?8kZ7r?rE}2&iQS8&ujOQg~3)HX9_VJvV zP8p7ZjD{IF8nPgiTRJ1MQX`(iNT(`~a~krPRWPUFGOj52NW;gts^Ak1pW-v-L&N8| zrr`@*7icKkcpAQh!yr2&8g58~UtyMsR|PuzST;^X_pQ2i#Gnry5!;D0Cv_`nq?;o= zbPPA=SY2$~;vtJc!%f`Ma2vB4zQ#8izQuO}-DQ1P1U>E;x@!y?R&KE;!)uQ=RU20S>TfCMLTi^Zs-cDt)fL%-=6hE<96D1&auTg_)ZKb zdIh$Zc1e6fcRdldMwOn)7*>jzY$@rj;ju{$zI6tTUwXW_Lf)T3YX{S^e8{znQk+38 zYXzw>vR){q?Llv6yx)Pq?((gcrK+7}RdHBVbNqU0N$*&6#mfNy4pT-dVP;+G*tVRR z<#U0M=}%39y5e%_G@a11L*6uHk}fg{mdC7&+s9a@=*+QE#x~lQNDN=#ET(@$`ZR|_ z*qF)b>FmI`WjjV(&+@3QG);@J(?pGHC+u1NnmnnH9Ot@eF~VJ?7npfxgh~x|W{>o& zI&JGI4-A3Cv(DnOAagDv!pFs4J~l)+EN2<1AOdo=SVgL3)n`kw$4{~@5vu4tuJ854@j*a^s$nly}%eUrR)44 z8^|^ku=6hJ+8csDW7h(9k4jDR*mM8hliwE5=(FPf0-Ag}vK)0I6h?g=)#3))#Z3%| zTNoC%aY@|4r1*Xbfp$h;M4%ogmJrA~wgg_lCAETb(KSsBL*B@c)BLr%~ zAdGMLK=cwU31(GW`#i+@g%l}DEE%i9F_xt)t|}ZSu(BL`$pz4dcJ9qgR3o3PZ9F;3 S9pMlkuBR|gzKQ!J0{;Wr#tP8@ delta 1010 zcmZXT&2LOm7>A#8=i|=YxtI=SOsP(_s7^L}Der-ZPz)u({_w=e+Ol{GRvR^Dg|UB=`2`tJgq1Sw9h) zElSyC(qiFam!IA2(a~NXt$N(2KW%z>zePJ87M*kj=%z=14w&@%=+oN=Emm;I$6+5y zAN>|bIBIgtk|PHE9Os0|pu(FSn|(B=yxyC)(o*4dOX zq=;Ne-A>hIQWK+f1KG*(iP833(yC`%D{2Hcy%={w`utzvm3 zH8GOTn4Gk^&JE|WyUGc8fdq6AS!ku!6S87!K1W#XpjkCArkV;I4dS(#1l4Sj zlq&fbYlusc_%E{Qs8%u*VKVX;)Cu1<*$(G|ThbZk9n;m?#+iYR0$?guY&BS}m(GlQYhZ45ibaJ1~{XF3C zAju#*=rYGniT>&0)c$jXBM@-yplV(qVy+L}|XRTtt+0YxLkNyA$0z7KgK4ws* z>v4-G92W3ofTv8$(`LmpCd*hn>rllei|5Zy{-IQ#_opuP&geB|1)KYmUAtS8`?e%^ zq*E3z2o*uMc+rdGoh*p6(4~f$OPrUyU-Qa?hg@D}z-5qEyub2d&4aw^@*0N~`CZAq zU8%Io>%3uc#N{Z*EIbq6w0O(qZQc<8mv>_}tf!b0U?CrIs%@bcOf>T$AHaOPxeTJq=U6 zJx*n2wzqPsw?uX!LQeOZtdWFtD{iC7Ov!@tf|xHcUK0xDaEDcS^(cCjf>Gw=xTY;O zPN8Cmv?SLmCJ7~cVc#g%)kyac?JD7qhKh0&pCdD8I-8^<;Sc-IQ5W``u3=))9HkTZ zI>zvS!}U3=P&kL3!x^VcGeM-oppK!kr~W%SO`yDHoVi+%uQGhYRfjVwTNAo5$Gjop zR{+j8fE8EFESLgRW89RTfs2N2mah=*i9x-bA-#ezy^xPd*#Op~ijrLaJ5v kYue63A*FR%=?? zcj?;~W|mZvUV+jw#7x6X(@j@RS4}rvG*eDB)7MO8DRiC%M=$E;d_40%=YRHp&c0`h z&lIIUpZNF_;95?&6tdD0)8rDR+2(c^Kg|xSSZ$&^g0vXF#+bE1?sTbOox@$UI^4}Y zF88uN#C_av%mX$FhX@;7+Sq7N$sn6Tw6oc!!{l2+Y^A9)$hII|rq_dpN>JT4Juap6 z21%Lf9X2}+_92rzY@$bO9(Ac=rOjiCKx%VGZ^ax%xwqO^HuTH5^7kl8Bq{d3w<^6; z*36RJmQwPK_o;wI)v5`^q;fv|IBedo+7_ z%A54X8}{wFvD;y9O%|SfPtGuQtI`BnN zMDsdJY~IkkNuTBrd%O{U%y~<5n70)*UU#6((>ZyeBfMktuI4EH-t3&kzN5V7C37~_ z#aX6sdUhmxQ_YEONzMCwpa^eC>`c^lCc4^dTTKzZ(dlSxz^@Xx-ks=&6KVBj~mMBmo;?znuUouO)8;yO06&=AhB$>q= zu>rxLzGkk(+QhhWN!N*2T+ag2!8_(wrY~T>$zt=f9rLHLkk3Nu1g)rNk*SgfCuEKs z@lJIlltCZj&*(7LFuB8Ak|D1-K1x{8$8rf~D8`A@`-}X;Tv{#YKH{+qmyO|X9U&)u zl9?IoNPY$B3g1AU zNb?I|RKJo^zj09g&Jpzo1L`k6Q|U8&sm^g)P4KgtHaQ3yoy^P7=qYBT2TCYH$FZk8ct5I9SL%`N}X_%~MFyl5CXnPpR} zW2wNT4S{G(OAyX64l6w_#ugLI#EdI@=hynU+kp;Y?v-S}=JbrzDfWzsb8f zJyLHoa4_CwP-eWx;K+EN!I$w7Llom3VCZ6e$uN!aHNzIh zHw=nE^AsSaGAJ>q0(n6588jF)85qGV9R^(nCI&qqn}dPnH-oQ)l*r@^E^VN@rf>xS E0ND*W^#A|> delta 221 zcmaDM`b2a?6SJX}YhFoek%C`Nk%GIrnn@rs01vj zYq)s}Gczk=`{W%QzKlJS**G=%EE$-Akbz;Z&Nc?_d6VrpQ`l!Qh-nLnGEVO26q|gI z(=Bx}13TkX1|`O63=WLb8GIOLF+?)XW=Lh6%aFr3kD-`xK0`g@0)}?Rg$$D!7c*>R zT*9CTG*AIzEQ1n*Dv$@XfI)*nlYtS;(qYhLU}De%vN;%7elz$;ND5ER;nD^=Yz9{V E0MB$ZW&i*H diff --git a/build/classes/me/blackvein/quests/QuestFactory.class b/build/classes/me/blackvein/quests/QuestFactory.class index a03bbb79c4e07b5178a0e9f42f884cace663025c..bc529dc314e69456c55aa918f56aeba5482815f7 100644 GIT binary patch literal 24476 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 diff --git a/build/classes/me/blackvein/quests/Quester.class b/build/classes/me/blackvein/quests/Quester.class index 5814197664ca2b42293343dc06129cd1506fecec..cda978b967f1fa47e2a6f80747eac1d683d62a85 100644 GIT binary patch literal 57119 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 literal 56236 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 QfKP0(K%;Piz?7)`CpS)@g8%>k diff --git a/build/classes/me/blackvein/quests/Quests$1.class b/build/classes/me/blackvein/quests/Quests$1.class index 28318cc4a828013ac21134d552dc24031b5c242e..a4892caf6838aae15a0db8d18976f83ae353e3fb 100644 GIT binary patch delta 47 zcmV+~0MP&03)u^>#RLJolg0$K9lrnv0Kfna0Kot_0Kx!b0K))q0K@=x0L1`(0LPP< F1woPN55@oh delta 47 zcmV+~0MP&03)u^>#RLJMlg0$K9ispT0Hgp80Hpvp0Hy$90H*+O0H^?V0I2|d0IHLi F1wnlP4#@xj diff --git a/build/classes/me/blackvein/quests/Quests$2.class b/build/classes/me/blackvein/quests/Quests$2.class index 6c9325fa05c07b6504bf445c75df1702e21ae87a..6382a03f3b7f905ec975f04cdeeb6b44f3459e30 100644 GIT binary patch literal 3042 zcmb7G`&Sfo6#snLFU+uv1t=<|wiE@6;1($r6os%TwSa<;fYfGpzY8O?GwaMOX{Ej2 z?{{hsv(z#xrNGK_`~&(gI;Wrd3+$XucE7WW?kduWbND{)z2E!#+9}yV=y8)M)iFDvo7;59koP>1OWzp4p!HdnaJo(1bp=sY zE#N|ZD|s7mvKFn4(k3JIHL>0LlpZm4YdjL&n-Ce#uq~2fDTeEEJj0Ik8m1s3*Bz&x zoE*D~VG4^FB?c`#se3xZ9fk2GY%67qXB}N?kEBSOud=(4O!~`Hx?y(bzzVwAOvVuu zR+79KWmx1VUO2tBnUvry8ukd1em&#o#K(N6f>#wp{X#Pd>tQ?VB!qOHp&|#^8W}Ey z5VaDf?Hbm2zwjpPq=MHpypA_C+=;asBDh_{9cb0C4);@%{T$`^N`b}m zz{IfZGIiKAMq1I z*pH(zLlZ!a^?o(yG4S=L-l3SP}cHI{3oum zwu*42p>l1*los3Sw$o|dqM}YU7Pp8`j^x?H!Xg|y7Le#D=-eFm9r?cWn>kMk%gz}W zUJoT_u5&6I!&f%&Ese#Lt98qPQ6}~pH2eJdL3%3;x5scOceb;SLNkdc^FjQo#_&8d z!qzG3sw*r>y;YYp-)DJZT(-ADlRGO0X$&oG?92P>2bPzRvy94xp&_rZFzN#LbLe*X zGuEX-ql%snpl;i=ovofhV%YZoPh5FF6cjT$mrpf^XB$ry>oVuRah>Tei~QPz0Q-xbA>U73lh zt5i`##vQ7UgzkC^JJ^R1eUG%zPv05@Dl6rv256^g?e8?d=>w*O{@0<6r0$|qC*3*i zOPW^CfHkd{K}l1~3<6DO!O!^8chg!%(%_@Ght8Tj(`Q9H?xUTNhWm56N)D5zAd&2I zC>?3~32YW+)yi3@vDLFEKgc?03m#-^&!J-EEVTYWXP}J}ZBct^ZRz>8vOt?sqtuig z#i`oT8l|;eZLU>kab0uu^`xxiXH?Fj$|qHyz;o^8E0v?Tk2ryISVH=0rm=Ju%c_^p zqIMcL&{4j=(ZBhO6?B}%%3rXmgy#7A8h+@1J-?~oId9|7E9}I@;Ue=PX}+#NESH0u zFZp+i6sY$-x>X);^N$U5lmX77aT-27Jg1|n1lv!buE>fX3uWz6EN3YF8=)hK#Rx#c zHHxJK*G^RNUAT$sXy9>#c>>K`U?Vp$z;|PePeSKYNb)pN+{Pr&;27V7lib1Y+{GUx z`zL>#sr(7n&-b%U`~b7~GkyuA2<8+H-~n`@oNRxB_2`C5W%e_A5T#GmyXaS`m&&h< z%H%XQ&`Ci9yNzV~sNlk^9uE>NfM!;QhY*t`$n1PcRk5AuCw&Y96iY9Zi^NbB3@X^9 zU^8P1h8Wf0MTAj)C7EPE0>gjf0R>zBLgxjPUVvChwziVC5^TeE+BtnOkKkT91<6h` H?ezCAP@Nrg literal 913 zcmaJ<%Wl(95Ixti<2H7oZBibkEd@f8^ks;6s0!*PDpI5rgo?6v+^f{Zv5W0g;s=m; zicdhSv*`u|3)D6L1mf692~q@-uV?1mxie=TKYo4t4xox^4my@~TsNSgsN-f1Dpquq zbd+^e1hNlY-;K8gGUZB3K&=P+Qs8{k_2r{pw=Kh`cH1K|+YB7rYuTZj*h5f_58Oxq z0%pVaWmxy@D3U~$nq6tNJ==M9EM4Dv-jh)rSx-_?tkwi{C+Hs8Ap@7n%|rXxwmjSK zSdZI>(ur&1NTng51h*3&W8TS4RY15riJMDfYAfvn%6+U|+|oi8ZX7m_$y;hCn_|*^6DzV#MN(ABQglv{ahdge5RDV%6|t z*^!}%TOi+s|20Bjdh~8kyFg)-t)4c?j)PEO{@;N(wkQZ=f#qQ@ZagKqt?*_csu z)*>*`k#WoRdTdLfJaqqi6!dWYGY{@agJos8Q^dJo3J<$P%b;daavPwnet|eiuTB25 z323~;6m@gpfOD9k#c?9ffAaW*!8FRPwNofxkr6nB%I`C@?e#I}p1L@veuAdP+rkBE3W=@Y wA}%pzi8L=$Q!&rz6HtC~n8xV=07SADvj6}9 delta 90 zcmV-g0Hy!u6W$ZBtOOMlZ*pfZVs&e4X>>0`Xkm0iZ)|UJv&sY`0|CdA?gv-_%#%k5 w%pubN2msXp5dhZ!H~`oHJOJ7NMF89YU;y0!WB}m+e*of>Gzn?}$CIB4NX>H}RsaA1 diff --git a/build/classes/me/blackvein/quests/Quests$QuestsPrefix.class b/build/classes/me/blackvein/quests/Quests$QuestsPrefix.class index f4ce177696ebf9edcc3659afbcda97f947570deb..87a049c2caca9d93948adfbbbf61a0d9e8eb81df 100644 GIT binary patch delta 489 zcmZ9HOD{uF6otQYZ{4f67gZFkdQ|+0 zbV<1kyNo=n?5JQ`fnvUAU4L3J{jRbVVXA#9sqzUksu!$S!e@+emkFOqrpz$yGsCRQ zoFXZ@xDF{_-&selvwMDiaJH|n?X*hBOKtB`?lgC?mCv3k0;?ODZAElFcX627yF59` z=2J^YyZItzR&UyA{c0~JLb8LR0u>IM7_y>`C0VNFHlkyJ_*ISEIWnPYsFmLE!K01_ zK}91m!fxVJDOPKV@oVJJD(jf24sEoHgGEPC*-5=%MCK4f@}WgSW;x$coH_;o delta 499 zcmZ9HO)mpc6o%hB({?)JVp`SG7NtI_MT`3WtfsmVp;p}p5}~PR^kZ#jVd?$>3yCcf zZ9-yY<)_&A2jbk(g_udsdEawq-us+uj$xh3h=Eo_G>jUsA)+IS zm{emghSiac4xnuc|8uH5u^O68OIQLR`kRO9K>!)m&8Rw^^t zv$;%WTkNZW8`UeW)UeRigx!|SrSjrl-MHkm14A2_X-WcGQH4SnZkl$GOOjKl8`0P^ zlxPF$BRK^gst)=F_(UgFZfOHvbdzK7BhXCPX(j|;VaqpQe}bb9&F!p1f5NIkx{j6y z`sr`zmlf)@t`0Usfgrs-gbD%-$#`*V^X>gd3DF7??iWR>ep*bTIxv8+g)?Z~H-s+g OZkljR!biQAJUu_Wj5`|u diff --git a/build/classes/me/blackvein/quests/Quests.class b/build/classes/me/blackvein/quests/Quests.class index 641347e7fe5867190ae69a369159f342a60b9a8e..55efa3a06df182416ffb34cea09a05aeee306359 100644 GIT binary patch literal 97214 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 ZzZjUqp>rJnNiahH1ug|oK)PO#{|{j!9aI1S diff --git a/build/classes/me/blackvein/quests/Stage.class b/build/classes/me/blackvein/quests/Stage.class index 8bf134db5bd733308912176553244b22c09c3439..c2a2f8fa7ac98903594b91ca5efb9565f4240db8 100644 GIT binary patch literal 4863 zcmai23vg8B75@H9k|oQ9ym=?`CJ%IZ6dDtT3IPNSNKF8-FK;%NTgkS&n^v?h+#LHnU#qJR94&k0K41A*)3$RDTy&~=t@l6r;hwwlcVeA(0 ztq{H)##kRbC^HX%=1KtiEQ2;x?x%Zn^zQu3nqJy0kTs?22^s_w+a}ce{4dv0}~so|qNyimZ*h zc9)%OUPe1(gR52~ZL3Ga8)836xd)k$@?Ct55w+O1GA%nh{H7qbTK zB;RtQ6N~X_j%)W4t%^sxtvHP&E_FWdrFn0${WHCG+)YI?1_U$@``~3GJvrQ)=*apr zUc0{4iTBu@txn2iV3rKKaEU*z;||gj8QKT?Y%iiF&9Cq84IbPuf*tRfm!+eMiML!Q z5zjcd*>Ss_xWd&VSkW@wnmOq?QI@ni9mn?}uu*I=#p|tJVOaeL_Htgexk)G9gPDBR4L85kpY+n8J-9r$ zvppfTlC+{E>bTsbPvz3ggqCcxBOw(W&02^-9nY8k%Swxn{(Gs*H`kgbXx ziDayk$MR-J%9|GX&2r8Q&e-6pOwu#NZzly5R%r2HOZfz1YjM)MhnecO?Y{OzTeoeI z7guUTD+leCL@bdUsVdD(V`xcQTN!QZQulIgVO6}p_fn6q+~zdzS0oZK+lqVfDN03? zP9HBT*EVEmpipQFgB7N<_S%sScEg?l+lfcE_uDCHKeEU+QAh$>g9_>fc5zS7P*I_1 zsS|hHWeTHe>ozGAv?Mwi_Y!s)o0RFWlkHYVj5Fm@xv@NeNiO79YGw-l^O0bqIuk7-R*G09Vl}SIv$MuZb<+hCH^@R| z?t)xHHqnZ8CTu?Z9C^OaS|FaBGI5LStH>G8HU|^8;&WFtvCza9 zKH-){CcY@%d`ZM@A}kRdBBCNXMQjx-Q?+Q3MEPGKCb}dDdPIZDG2uw`dPHnT(nJdU zW|%bM%T0V4Uomk#)`ak)iM3c`q8ITHPMb)eFNBvAO1*e^{mO_B?q%u)=9@Kwu#BiEEaoYVHS52 zlX_XajhHOV;utZBMF}C6H37asW_oqktOJ_4OyA>R*Dfr2?Z)q9BdJ zJXDm2LV0L(9x5gZZ#juEX_!>UQXQ8@Nlq=zsbx8}Jf~LV)Jm#VTj<;PG$v4=NNbbQ zm`rtwOixXtntF}sSEVtHdgj9EIdw)(otaZ-<xH8(gLn~x(?FDY zxC#QWdVjcox+J_SVVR$iISa!&D}(ntN+- zC$7T%EW5`r15cv~$GGz}seBeOyvD@6$#njOz2*ZZ^JApcXt=6^UjoxHpd#3zny^zX zXP3F1x0-%RF^HW+N_r0^(_Qd7{TW3Le9-U;7VJ0PYdC`i>*k$cviUQFg$GbL>L_s$ zagl~Y#32ojCLXQfV&Y;AFFMN{odAalT3aOQ5I%JPvpwsaHf8FUncJv%_-qC*_D^$= z(~G%vv38o%vU_oGnu>>m(*jJ*mlEQVAuI{rR!Ur|;WFYf4VM#_Yq)~ALc^8Bl^UKv zJVC?q@X15?bZ}oaakaKSjd+@drxQ=t@C@P^8lFi!Q^T`}XK8pg@oWvxA)ce*xx{ld zTt{4|#ixO|LBsQi=V`dn&jts{Mk7}nhj49>OHNC`8-r|6@oTzu~K%k7Vl;q?m<27#XQzv6CPmgJ;*A3h+jo}`StJ!Pwc}s>}PcyU`;*F-A~{? zJjvOoICBt3ShGVogi|=oihTy>IP(Uc#d#dXyLb*4_@59T;y5nigepRs)q6^f$BSwr zURHDPQ&o#IY6)IZjrh4*jbErWIHxw@SLzo0Ms3A!RX1K$19(l{j^C?$@VeTA^XgIj zLG8nv>M;JOj^Hgdgtyfxyra(I&*~g5s5kIebsq1jckwrM0q?61@eg$o|1^s5FJm+= z8sqVAV=HO$aR>4@Jl(AA7#%fhyw5vj6lPWSgRmj+?!iKBH7`v2d>{jE9hgFHO zSCtwERhe-}RT|H$D&qw;!8oHP8oyJMj91kZ<4%z_VJg-R+sz-B{a8-M-AMCWgI8- Pq8g6!nc@#@zTW5m4twr= literal 4774 zcma)A3vg6t75@I4kWIEX);ya_>%Y6hL67g&Z-<69U7H}kt?|IsD z;`3o~z@7Mh7)L$rSQtOR;SheP00n(@GHKdv2_v00(+Z^AMzCA3qSKWdq68odF$K4HXZ`?CD}hIA0MWgO0JvC=)URGZ<%dlVwWoIrd131iT- zd6#RgM1ohd9J7yTMKa!FBxxjdsq;lQExL>8?ddaF3ojYz%Hh6Lr|(Zg z;P`ec*=u&STWN=ZSupIxCH^>;Ge}S55gY6`-H7Tmzb@04zi`V4cHC>eFCFzvyx~}> zWX{1&meXS;6+SV7l|ZK3b30upYHXv+vOFL1HYyCJc%9KF3~L_2Ucsvl$F`E)uCaX1 zmYWG{z_dS-H$Lx#WOb7CrG2Rk6Gu|#%|v84hX!MY-EBH_ZKS{_O(z<+9P3synNIe{ z(@~?}ic*QLTi@ooS=HqkUTdb)tQwlC58QI8Z5xBR+|C+qe6cs^rX+Cr+WeWZl+=xF z#7WxGg+Y(j)wzK{;;RFxyxugVL~3(cabZ3!k(*O?qKk1U8XYM?frM|8eeTUG^GD^f zn`3y4xmH*fxGa0ehcGx0gkYP{(>(K^;*PEKw+Fnzd1(v@O-exL2{A znB+sJX~&Gt1V?J6L=zhg_G9AQU?~fnR2}~C4u?eM;brEwjFAvVHwA8RUFTLa?zGOj zk=~`89;r-~D!ycH3HvZj#d{e|_gH>eDTF&x89Q#Sw8Xctd(<2Wz788as^)!(V2=;b zFP{lneq6^AT&-i7h&B<+MXbQpMRryh=^nbEW3^1w6%HtLULDt>UB@~R>qT5IqC><6 z5u4D?U=5cj_X5)|7k9EcZjg16!U=x)>$nl0{Xi4*bbRhZPPszI=f#^Zi1?xiLqw;D zF4;Ri5GeAe_-jIkDfbTsGhZ}1x+QRyh!hy9ZQz&Y*b(omV-UCMScz*w7}Bu{*XZa) zB7_q<`j8Caq(ZeD1-GwxbYSR%G;&`%T7|h2n}#g`kAUy%R1qe-d@S}z zG#`t9Xi%mNOimnPsm~-^+}>n&SDDn+}TqL>a>D7 zy`au0s57Zb3_kA0pecuDxu}^ace9q}I?T>uPP57)dd!V#hSKIADL^%2TFajZCZi5> zP>;p@vt|wdnAm`EWJ4n}G#&$(fIBe}ySVC6*4IHy#dEj{r?~nh#PABUb)Gr=E3^1- zHkEhKugbAaHNaNW+32GfPz!J~?Et!$L!w)Vlr$GFzopO9ml7uZPc1KE?mq2&%W2GA zJNr1Z%ikefz8|AXju4j-mj!T$I26F;#N`28L0l2Q^Uh!#hxmxl+B{K*aK(PiaIJG# zm!Y5KPNU-DGdVop+s%jUp3kN81G_matLNu;Q*m*Aw*WohOBHd|5I&i|TQzZY0M`)L z1aK{JZ2(7zBLQ4TTo=Ig#PtC@hImW>Hxf4vVL|@fV zKKhHi-F(RIMO?aQ2v_BIb68d{%I~J);{5J8oSd_JUycV+&lVqIE6TZOz!MJ3-e}$y z6&JgmEyxjR{JJJ5`~FdI8rWB0JecCjMwW2b$9s~^No z*p01tg!QwBwX>J2_TgUar}h}-<2ZyTFoXj*$vQoQCvg@};Wa#sbDVht&*B1(;7$JT z!9^TZWjMx4JDmERsU1{R+EG=ly`XBe(<-9qS4K7_AS@iW2wC)%YSZ>DlW)mx~dwL7>| WWBxwH=Qy4t?;rA!J}aLF@9}>z=GmnH diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$BreakBlockAmountsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$BreakBlockAmountsPrompt.class index c729520bf8beff1b3af41453a49f79df8f89b6cf..0b2b126fb164de42f2bf53342c4c17744fffb400 100644 GIT binary patch delta 367 zcmWlV%PYiD0ENGMhq*Jqt`eh(D2bJ9?68oO1(9bF#n33s%NXy+c)#D*+e-cd&58x3 zY*<;du=Ypb+Md4eoI0O*zj@B<&%+~7&h?QKDT*kf9%3Fw9m2#tj5!RFP>eei(yExe zyUKE9TWm@(t*B50tfH7PPp*%&S%Kd?DSw7yPBYJfCds0CPU|a4vZPsNMc^I?LuXk76Np01IvWC?iMf2micQTH+nODAHGAyaHO&Esnxp^9V-`#@J>P3IC!8wI%uV{4 z|C|ef?vDopBQ@dZcqB2Vx#a4$$t^^IX>t3!wb4*C-jNszrRG$w6lFFnGsgQa>P*mS z6!oc;Q!Of*@yb>*WgEG&opRYprR<_Xc9W1jEXsaXWG`#7k9!&5#WHVlkZ(C`O7)km W(iv4bVM>wI+Y8C`*yF-XApZb`kye8M delta 350 zcmWlVIWNRP07u`nQtHCa7-PgMBV~tzs6Nm-{ zi9|!8qM=ax5E%V?zhClxy`Ns^`RDE)DB~>Qg!2a#VK)&sLks*pl-^*tH#A^X z%@WH3;nS?JD#$WJuB-yZnr591%_du#ZFcODW|uw9{{LixSu>xU=Q+?A4h4SWRVC&v zIh1q6u|W4kL&5%Uq@7~G&i1CQEt|qW>Izh?o^A48a%R= zbXiBP^iwA5sgw;g$|hp6nYip=Nw%^g+qjkOJXz*NcJeK|OpE@qQ>AHD*#U}>G}vOK KyKSccqsTvoh)~r4 diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$BreakBlockIdsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$BreakBlockIdsPrompt.class index b489dcaee842fc1b018821394efa6b9044e63370..e73e9d25cd3fc05d25cedfc0f4dc4e6070e6bcfe 100644 GIT binary patch delta 401 zcmWNNO-NKx97oUnk2CkZH#ZO(1!F={qc9bjAdPa7QP5&Gf(s!6o0)|*B)u7}%u-9u z%8#a7ewUV3>&abUNs$XT?%IfpcI|TIQhM7ToZo>n9sd&dwhzC40}^~Hc)7ZqODB1U zUQM6FU59%fKKC8^J+eH|40zPgp?OsN90?uGX$CbznhTnAfM|y8W@uMEwo4`P=o7;T zqlPh_+MgxuC&m~zJma|{lIpsh%47r7@PY}2sxnM6rHI)(p;*0U+VGNs=9R(n+VF-M z!z^=#dFBGEVSz=%5~H?1TuNe@SmUFj zt+3x)k(Q%_spN*_WP0Z SWj>7v$sjJJPLR~+A@Uy;%V2~6 delta 396 zcmXYtyGxs49EG3v7nAqPmse1e6vUu{iWf>~vp7_T7CJa&5gg(mcw1D2CT+FRYSma{ ztF`*J-tQK=6pD4Kporc416(@kR@@!MZ|Hi?dCr0JE4C1GFYb;{fdtC0vZrvm(!HJiEj<~- zJ_m|t|AVeQ4jB70@Y`MoA06d&yVw%B2QK=v=RUAq+C(^)~)N(F$+)BL?i7H3ps#X$9g;!qdb>Wj}ia0{j`;{Wcdo#r- Fat||AS#1CS diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$BreakBlockListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$BreakBlockListPrompt.class index d0cbce1e08d948597c96b5c6c666544320a2e16b..5b477b5aa5257e6f43eabfb3bb30e6ef8ca4e513 100644 GIT binary patch delta 789 zcmW-fZA^|)9LBHzc|6a3p8GkTRm$cA6}CQ9YOQ(uLiNE|A2rPS5ZX$$ww_8PA@Y{U ztxzIwk(Z>W(tA-tQ3}0~ie5Fs46{k@TFHOaWa;VD`blnJ!q znZR?jYlB8thYsm{fldWo0x$7OvzkIouhC5i(0pfmYdNMRmR^BAyb*Y-7j>8xn)?Ob zVSo_$-{GMY%p1fI!MZ&xG0Z0+J~G-TIMNm`@E)DokmBd`0mA|#7!?@9xWF1rXp4CX z&DZ13=AhW<*tifqWbfiJj6T{|TU-t1QW&WW?o?rquuijp8qB3yETuX`Q$5nD0kzbK zAJjyi)J*HBg;J=M@~MrwshtVxV4l>;Hc}7Eq+Zrc{q{n~ToyVEGmYp~qj04$tfFy* z(gY%D5{dK)sq`87G^KyR7xd9rjM6tu(ND6{FIq;wX$AeEO*BnuG(+i(Q3f+m5i`8e%*c&zqW6Hr2( z%l*QYd}*jpu#WXU8=P&U&!&Ju)ETxo(^j8tE^oWf4mb2phg}Z49rhUZ8X64y42_2U zK3|Dgc5+3g-$0Qb`A&JRSb3guxpZEGbRg{N_Uf1>%hxnp4su8orjn)8%gZX0rB%}= zRA!Q?z0zgn*Fn<)L?wV~HlxeZ?a9rdi*ykZ^m#^{8%MD5;j zoyoNq)_LPD5ZA@1RR_IwiJ`j8ICWB?D^%+$HR_^X*J#moI(38Fy2*XrQGxF2b^WO~ z^_Rx#zUJwHYW0s6>7jP&addm4XZkm6>(S)tSvd2RDawo3KaBV6_43+i`vye|vpLd> Ik@Avx4oL0Zp#T5? diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$CutBlockAmountsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$CutBlockAmountsPrompt.class index 34b4c1430df3f273b7c61737447a0abb7381b700..8864d1a8bb0673b91db9f9ad5e374f4f2c481bc3 100644 GIT binary patch delta 380 zcmXYt-%FEG0EVA4Jv;k8PBAdkiGu7l0@)RR zN6XetH~j&_s|t1_-W2E`;EmmS=RYtyLYFT*@AJZY)^gqA{;vJ30x`bsxn9&$3U z@xmp?Oo&;R48Ee^(#|8rt4jHHU4zBu6!VHsMaotbug$Nzi~2W$CR0&Ow-gJSB8!?O zmQA%j8C_yUv&xzvm`-`=sjTg5*4Yq(f%mAxI3e$dg)L44LLs;YUm5| z!@2?-q==&Csqw_ zd1qK--LS!XH*MJDgW=<~ZHswZlsnOFgJs8lm7VHc_7q;W5Vnns7J_iXu+Jw&+8)RQ zTZ;Zv^)A&P`Z^x5-^%}}`*z0bR!xVeUP>ifD3=r!k|r)~G)gHQSls{s diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$CutBlockIdsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$CutBlockIdsPrompt.class index f969ebf75a214c4fc67df07d4362a9ec0b056e4c..d96fb7affcf1076359dda34ac03461a7db8cd568 100644 GIT binary patch delta 445 zcmWlW%WD%+9EHC-?JsvSy-L+8C{YI#i-k52A0S#>hzp?s5xNjm3`rNMV^U@&^;NCf zrmgSB>m$D3bzQP6^?^%w?gUr$FX+mZh|~4qJA9lok(tYQ-~TOq26D_byr?HibDY?v zrWtiP=W^a7>F^_EwYOc(GblTQMnsLol%>hj*K{VIwV%slu-8S1Z9TSF0 z>V_$%?U(jr<5SESZg5kPDi$imp&&sGx45lPzTpmc6WLj|`7#8lKQhBn(e^W_V6rvB_Uy{9?5d7s{2$FV#kZap*Y@=5maRdRfjUHp;V$`N0=vQKqOzx`pBlG@g){p&;eaL6Y|(CH@ghg`<_4?PlZ Ar2qf` delta 419 zcmWlV&r1|x9EYEG*6+UK^e*jEvS~sCmV%*zSM64Zz`Y0^79tvUJ&Y||II~t}S-P5~ z<&QVDpOzJR7H^Ri9s2{kM28Oj2hu5|@%n-1!^5-LI@Rj^IQaAh=;h;*7j=#_QY3PT zH8qz}mz!QP+;X|?QDIDT$D@r)n!DRuPU_f*=ALFk)2}Hfh~~cioch`DK#{k*I-k)@ z8m6clrkSx{8wMw)d1#pBks@6Rs->Yy!W$klr%=9Oo+paq!@+3KQ;Wk&&p=qcHdG!6 zqr~W`VSz=>l3^KZc*crhl{Le2))EuL3tk#tQCGD1hm2pkUX6pW8u{hgjY?PwV!J4k zern4$ljN|+VU~^-+ diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$CutBlockListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$CutBlockListPrompt.class index 7069bc820969d3528f0161c5c81b10a572eab0c2..0dea3c746282911038d50c76a4e327b913096bcd 100644 GIT binary patch delta 806 zcmXYvTX0QR9L9fZ`|q>Y*=LD#geRH=Qx8Wb#u&RR_}@xU02A@-W_^841T^?l!eJ^Ww9tNZwEZ<|_y zemq>}_e>>7`e-UNl~yNNeC;!s$(kuXQ~4%Jf@zxRR#O%;EM{uHwK_{PTQf&frJ3u8 zt@C1h%={P&SZJ}xW3gt5wJ!C^gW)1Nh(pRMT^k6-P)%^tP()4y5#Zn4E;tENu#hi04RPtA6Zv?7xH ztTfT9uOh#2!uWJtwJTMhj(4b2YDaKMKK%4AkDZ1F8VyY}D>~)n6jUU0hL@F>e38h> z^X+wuVHd52-RubqODd9|j7xazHSA-*;Q);a3OtgO9v9-L7$6k@5N1%CY$s$g<(&iXB>cr)^Gg{6#OXRF`KrW=` zeNgQbUn45l!>Su(%T0#JEsEtfrE-@_xlc+SP$Lg%mjAgZkGLa`c_L3$hCEXP<+&Op zFVz@%rDn-%RV8oLB57B(u2RojN42|dkjmQOxPGvqOYfk#%W%id2#*DwtHZtPAFj$z Kq5c~xnfe{-cHGSX delta 766 zcmW-fM@&>v6o&u%I5Y3^<_0l(L@%k&_n{n#SCCWR1_P6 z@T{YVfQ2sjL=X@gs9>S@Vgc-(s0*X`uAA@6z4_07@8WoZe>t?4zqJhj7U6A{HY+6z zE)5)Rjs)pMi6jkS*vhd@!*=ZOHV->FlBIV^q)6=M*dx7{Bb8$x$9|49&1^kj!x9{{ z;Sdf>98rtxRwSt%%za9qS5mYVx{Ppbqr{ zx6oj=MJKpdZ*-}+EpP{S1@57m0Rs1BN25d&s`Utq-RpsAmu0>0Lp)Mp2sEQb;4z-) zeU?Dqr!x5rtt#3C+R>q_)(C4Sx){Rsg=(mtZMEBa1bWdY&~FwsSZ8_<2n=F~VcGvg zpqlA5j1j$3^|L-lD}&R#cKQpvz)OKw7!?@9xWFpB)@{7p=;yJDTrHXC&D^ zDc-rTP#)}5V8r|UQI;2C8WkawiV;U8NTX8JQyG3x1#?g(TSEp*rfQZ$HLQo~6hZZh zgBp|#)Tm@olhR1dM#)r<64eH8YB#Go5J;T}r!GWMH)5z4iPVo28bA&WqK<~pPs13e z5qzdm=0js_F}-F>=^cxt_bin@vNZa_(&;NJqVH^iCfFqX)bstT6#A`42E-^dX=;xC VAz-@S8FQaP%oQjw-EA7a{2#mr(nkOQ diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DamageBlockAmountsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DamageBlockAmountsPrompt.class index 25d45913f4c84facc59cec3bd48f4d4d3b5b20ba..4d6c18b2c245c165afaccf1f7273af5896420f64 100644 GIT binary patch delta 432 zcmW-eOHUI~7>1wI13m3{h-fhg)jF84ASMp!4qX^S;zGMJ;RhVcfFpB}&a~bsTEP1S zk5|+mVOYt+#6&lmn7DA|!Ua2jgmG~Hyx;TY{kBKfs?OKHTOWZsZ`PgoaI8p5Tr9EZ z5YZ};I?RzN+72#f6_?&`49QB4T~=ICOestrQCzj3$>I!OPVgr_H&=< zcDbp!MNd#{nz-qQc~rB)szA7!HEs)rE|`w-+F1~KjUZm|XB$D9Ywu|8a!+%g2bzaG z%DtM$JkhN07@o2u7@S l%a@$_Cdc_BCv08+-Z@qoIKD692n9~(KVYzwFCWpN@DBsaX+Qt~ delta 400 zcmW-dyH6BR9EHC-zm+>XT;i%I0W1bugKH>E(1H*X3)zaq?QdYfRd!Z)XV(W$dCD8S zKET93!cb|UG0{d76FU-OEbROPEG&qF-6_6vPVy~v{^|(69KCxF^s=`T#NB00>{Ic% z8&Kq)Pc>kankESd8PYV~ylRy*DRy7;K+~tOX+`tUeUwA>$i2>-Z=NtrGG&-%#(m1z znQ3MXkC{_64cmA)8c(Z+c@`8ZG%T{DXuWM4HeXLl^x#_#=NmI{$L$`bGL-w2J{c&4C!Snv^{|Ne3A7sTN zCqlbq=oOzUl4VeuNyIQKr^Ht9ATRPlL^YeJ@a?91TMK0iRBXvy9 KPt6vo1wk8^`~g;~%&%!k8#%5d>zqwN?@lIGeyl5W!()h_Ojw&S)2>yPDlQ z{aM<@vYOho5jPPO5!fQy2DJ*CMRdiA%tb_}?aTWpQ0c+_o9G-dLrCKAy5yMf#CPO}%7>)@Dx%k^gx0I^M zaW~bFX*yvUX2deeNjKN9y)ep{6zA>Un$DuxS|i^PUY7RP1FI9DuJnXpVUk=R(Saouu*5m!yG_HSCIxMjHQrqf$f z(@FX{-MiurcLhHm?hSVrw&f$sJ!(Q%ywK(zigmTd7qTi|Xz{!HOa0}ZL}7N)>{My{ zU-;?2k=O23kd?QyE1QO8%R79Xr&-_As&zW_1Do|DS^dN={X$j0GN#{|(H}g~C7$Uo op6eou`dd`%;^`k*m%`QUe1e@@*15dQ29#`aJI!8lc9}!yKdc~m9smFU delta 413 zcmWlVOGuPa9L0bCzs}rmKCj>+DPh2%MG%BvaaV7G zG{t~ELw~?Pz+mW!V*$rQ3Y;(uh3w#v;pEbTpsJzQaLRDnu-B0F5yKe)Aye7dy8LAG1QnGm*gM*~rFe_y`P z+@9|_lFPQ|i+1!HvjTU`No4zBZ@9EMHl=LGb`k5vD!V~?@GyTeQ{l*_%7u7Wh^oQ)! b-!5MJ$=9yew$`WFjgs<5Qy2Jq)0EInmr-$V diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DamageBlockListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DamageBlockListPrompt.class index 6c5d9205d7c7a92754688d0514e0c86fbcd4806f..8bda0ff952961d5238cd04cba5a4d0c2e9c61f25 100644 GIT binary patch delta 802 zcmW-fNla8h5QhIQWM0pk4w22ogEFXz2OuaRZWp4M7z~Lg6FiVO5rXIdff+#AMnO;z z5PS*>;=(GjJAiDWAPAzMD5AK6irayU@#ylJK74;A{nuZ0s9OIqe|6$--ynb>{47=1 zJ8ZD4;7I03k(w%TOvMfy=SWkLjtnDg$mGb9>X0}gagrljY7WOKj$DpBj?=21dd7rp z$Ty(?XC(?16mb+w>p2y^C{a<0^Bfw-1&)gjjxyO*u7Yq$!DSWxsFZWB$d)ROt0r8- zbp}U<#1w=35lf0C&}xZ~2@H$3N5@1b>HC`X7ho26Dl?v8TETOH7nspJ4G}IcF{{NJ z4w_yI%;Al|TRnTuu+H#K;5|NQOqp5z5%Uag%gM?1SZiQ-tj#X4fN5<>3G(=a&jMet zDDV~E1oq&&7Q{Q)8ZFV_WeiQQCM50Go16K6%<(w zBh~0pweX=jgit*qsR6Onh!kpqgPKuAE$F9K%uyQ_sU1ty#oVZyZKWQzo%-1U8elmz z$nt2271A(kq!IRuM%h0a*P6Y$*`zk*y-_Rh4rSAN73x``-(0YMCbhc0(iJQDe_NH= AGynhq delta 775 zcmW-f+f$8U6vm%-)!yH`zx`?wHRDEw85h-*CZ}#3GGmzjfH2LJ3R@*+??S09Q6Z79 zldTgvhz{yg=^#o(4mqX>IV2axOk-R+e6O3|v))$$ z42N9>hl3+kYMR7;72!C*aZp7%GAzd95J#reED5K?VUBF6M>ujgj&dC1$W@KhJS$cq z--_cnA#qYc0mmt6EmYx;(<;uOh~q4W#!>9#D3Md8DhOo?%2foyCHJ0}BNZH#R#c%{ zL5;LsP;gO27+f5+(p0CQUhZp9a9Mu3QR0fkRf#5!W{wt)R*q{NZ3@~M%#K|)`;rib z;K<|zJ%E{r>H0Fa7RIh?Q|=45b_jH$OW+2&8N7o0HpC{!?o9AopOg}pX!i?JWv54= z7kvUZ(a&Is|L@ooZ&z?j;5G&X2GPX;fjcs3Na8NKv~4DTw|j;gnCWkqrfM87Wjf`fsOd8E$3~z z*^)@^GYoNB%$yLt&ib7!+hL-3_|p#EqQxn@l%`AsnSuVA+0@7I{b+Dh*$^KHeHafqP g^=q@glcQ+`;ppOqgLzVCb_k#H;KuOg@R&n zCSs{Q6h|F8a9DKIfzAv41s(Vs1jk}dovgh-_P6#;^Kr}WpWELTKsQ@137*93=yQ2U zzvQV)l>Ru+7_i%OhZlAZS`4`iGa?yv7;_nC!eP>-i7AJ)J-w7n+x*JnwZ)9Z8;99O z6dB2!WM1%Vx6}|Fl`NR+hJWI%`5Q@S$)aM3cZy|J%yne$!7{6gH9SdHkt1*BqwO8O z;yvqvST69rs^S9$fy(=V_c`r{p|@Tyd}Kq=X|7~vk0PL`C{b2yQc<)~6*LdoezJHk zB>%ti^IeLNnqa`1=8I@Drl`TK4g{i@EP_AZbh2ZQob`lXg uW;&i0duKo6LOj~X(FY{-A-(!58U2kFeZ;o@&apO}>mTOQ4eH9{#<4r=AXu#c delta 340 zcmWm5xk>|36vpxYH4|sa9S{_S1OyukMGz6!MB^6MxbM;En2hTfHK_z4zQZl@06u}l z%0jFKeE~aLE5TaKZGPu`obOaxew)j0f6p&K4<&~v!*-3hLyUyUh=W1Grjb#-B`wDE z9M?=ZOfqGXvY2+5Vb)^KsWs;<7W64?vZ(WtW?8eMS+!V;AXzurFxeD5mJ4-8%4AFZ z)P0I=^&W~kk{xy>8TQm~XtN>1z9h?m$)UvKNbMT!9XUxJUl7g(zE_kSb0Uy=Kk#nT zeyQZ0_>xo31YN4z>}rynb0G=1loYscNBAKm+Evj` ri_Yq+Eks)nmfK6z?PI|0XTu#N>ke_}4pVXCJh>z4%L!^POOcs>+@V0x diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DelayPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DelayPrompt.class index b69afa80a07968efdf0d7436d9a1e5be3291555f..d31206148cea426cb47843ed958911e7eebae087 100644 GIT binary patch delta 434 zcmWlSO;1x%5Qd-I-pjc?o=LiBz}#qJFt{TmB<>}!Fk0~gi-;hUwtQY%EJZ}CpeUfC zF3!T37kVGey{u@%% zoMIxRSNhOj@MyEUEp4K> zXQ;DiXs~3v{LyTK`-Wv6BsRke5A8?)Tx-?vh^9wSiYvvs;<4cgtMDoa zjP*n>SK{J|;W;l18*F-X+HBC7Gi>qF@QT-lZQd99^-~J|zP?>w3-W877nwBAMWfOmSAqbV!8@GD%)$DaafP64R6_pQOeQsk0}G V97%&?S@I%TwteQk3;km*{s+a;SgHU3 delta 411 zcmWlSyG~S56o$VubH;sUvlmWq0_2F%Xr!Bv%o9LobOe#RiZBi%3d6hZ|qam1Kn{OitYA~U3@C??z^7p$1HEy$@RoN0Ia`~~WeuyW8P<7k_`pZQRW|H#>R^BO%t10?{@8w9NSMF-U-VMYmLQUl zSTvX9ELX&-MQD{;3Q|XpoMT$D%u79=q=D}e^Ha|AOPcs67lK$W+EKIZLbv4FDGJU` AB>(^b diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DeletePrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DeletePrompt.class index 99983184b99a97a4e43469cd187bdb3b973246ae..0b6e5150815f8b35e4788621befca6cda3ba1616 100644 GIT binary patch delta 511 zcmWlS%T7~K6o$Xkp3}X1*x3_JAdMuAN;FYoWFXEYF)>bTRYb)rMO*9z3vKa=MZDq# zP`4uGqP_w#aUcl~;K-@*9rOiE<5`pcU+Y`zU+Y`yS8C=*`}-Eq$ET2eoJdBJ3E59p zaWcdwo8%Oyr5e;66F(zlNOM;FoaVg1Va)~2MM0M|m&LDWu7>PkMCLiosK9HQ>mhjx znlbSsHx$K?5@k&#WEbO_n;mphRZK{FQeaI}S2U!b61k zp37chu#p?frwwzwkV7v${B*Stfmbq4PEO_PjZAJluXt^kXTfdyhZBpu@#u2xSl2ei zTf;k?M?Csxc+Us7J4h#%_~^0M{S0=vLSXeWEyDp;+;q^dS6P#0-E9UNUU#&!J$bZR zsn&)X#md)Gq8*RfIadn*g?65PyFkq@x`~dzJM9wME|an?dh7}Vc9pDMBWKrX+RwD? N7dLCl68>Y3{|6X;ZBYOK delta 495 zcmWlS%T5$Q6o$W^>7J@-s!WU~kV#BB8iI)uBMWh3bY(%cRc-jVrTO;O~aW+>zy zv1V9!dPFfAGRA#PDdZ3jG~;a?;Gv={+mA$6G*v}S`ntq~=CNW@F}2+)rTkIFwChg) z@t=6KyRWMKl;J52!!u?inub{#9^P@ob178R9reex&@jh*;(I)TMCHqd1sZP1?>w<6 z?=pS$;z%4BmROcUFFgFHJe-IX8D}dKajl*&j>n2s!%JSdmVYv{#%qrbx0~wNr&u?< zVZ$Sx{Abw2xvn6}yycz8VOPoS-}tNDSg=RG=Y!!GA6+x()mwa$=Cf-B+uzqSJL#0I zy0vg8w3GDODXMnbxwd}??JU~Pk+bu3+6B(oMGAI_qFrXjuCQfS-8WN`<-PXYf1dtj A$p8QV diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DeliveryListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DeliveryListPrompt.class index b7d47eb707fb5fa838f0ebe85b42e04e54e9c417..e96859f6d0e0a271a8545100ae06f039d8ce9433 100644 GIT binary patch literal 7868 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 diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DeliveryMessagesPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DeliveryMessagesPrompt.class index fd3ecff12c2f1f44449536b1401c445ea8f91670..62acd6a139212a17fb1ee1bc4083162a40bbe827 100644 GIT binary patch delta 345 zcmWlVyH3JT9LB#tQco#|gaI%b8H~onp@FyfoT!92Sid z6K`=eY=-y%#)r`tFqZlI<-7gH+C$3M-^V9_X`Edvl}Qb2GS(I7$S`CT#IeX=Fl-P8 z-Gb>%BngSMxRTWO?-w7-6F|s{s+<&W1J6_t%l^@z$x(#GVWT7({@IX?GDiiQ993AN z=bss=^<@VZL2-%(IiBQdP7gtUDHma&9Y_W(x&4w z>~QR2k7FMP42K*?I3|R1hHW;CT64*896fJ13@wfmoOUlHB8q$EBY_1ku(sm)b$f%a zL~4K0qb?I&icH{K5{R+3_zB!ZZxLX32(x<(vku1D1LoP2=qN3Z91EtR8m8dG95f&- Kdv|Hb!S@d$tXAv* delta 308 zcmWmAzb^w}9LMp`_gvl6r%#h6v{GTRFkG5gq^U_d+)y#taoR`S_1dG?9`##=#HJpL zg-OID(oIBS^;h^8SeP2^{C-XEo3ZZ{|LncK1DM5Ghx=&@D-5d~Yp@Nhb4(&{pkzS4 zTz_e7g8)Ktx^tINPeTt>R!jOsY*WC2D^P)_LOmO=pej&W!=Qo#ut23i7p*cUj!p}-N2 z35k;QoKV(Vi!uo8vJ4EI2%Mtby^0W#*||5n&%=+TE?AF#)OqwW@{5%5r$+c~vWF-G j5{!^$8m5?z1;*3|Z}(+BmP=Zgfrfcl1JplZp$P3CmyArl diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DeliveryNPCsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DeliveryNPCsPrompt.class index 4fd68dd8e428d7b401b44b152fe40daadf36efd5..a5b699981aacd6544b04fb5916f15d48cc6d259b 100644 GIT binary patch delta 495 zcmXYuOHUJF6o#LVOV4!rsU!vsM$nj;xFI!c)ktJ5Atha?iJ_JW8JL+$Z&F1N5e1b> z9q%{ruBb?@3u6pFz^zLcveCqq|G@Y)adkG&dCqzBuD4Hj*kAvCUIV(QRqRC4Cy0^Z zq|Gp+F|y=rHj%d}P>gb%Qx^U8Ic8Ccahfy2xNz2D!eY|K=bXhqxvbbaoGPZ`UMd)h_vf>2Fm$NkdV@|@xT3kryr#^x z@OM++t}+Xn3fC2pbSg+Yo{?%oZYb1F%}s8F$C}#?&T4LRM{}2Z!hOvH9tw{%i!5m# z^F(;6dB$_i3tpPnG_QEAS+1XY!+f~fygm9>^NtlocV(?J{HQjEt&!es?^#voLC158 zPPWwB*OSv!`S71wj;wdI`%e6Xmr9Qm9XE)N7Mxr@7w^e93D3rp53+q3KzFEDC_xC=}`#gh9^Q*j%|K7d>nyHR? z>GpsFaf)<#baF7xA-X-5Q}XEHaEySm%dXly;&L=jFUN#F;kZl1<%DM!Ctdn$^nh^6 zV;y^i)79$gx+aUA5zY#&LS7iMSHd|3itPIBrr$}KmC>o_c}3Fvkz~DaL35E|%?P7r zG1|6vgiD&sj47OKrkKqYteoZwMxlJoRj!$R%Nm0r&2?^QZgNXA&TZk2W`et#N$v^v zH4k{GdBkJ;k!Fe~nx{3NXAE0&KVR~TT|IurFJ}t*4u5Cc7Ju8;HNtbvG%rlWX)z7X z?&M2eDRf7!kT2)Ddo5Mcyyi_j z7aC=jX8Fn{`9`~ZXTSVlRDLop3rxs7lk$sM`OTc=7GzOHWy!p+|7+#KhK(x%HV`3g NODEylssjdz{0GdScgFw# diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DenizenPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$DenizenPrompt.class index d127fd2fe82f1a1bee44123b4cae226a7f731744..948a5579f4eeb3262d24b78e3d3295b4ff06b939 100644 GIT binary patch delta 597 zcmXAjNlz3}6otQs-CafXdx$Y1kpxn13^6G?4m%bugv6Cm5CBu96a5wLO#BbVe!BVYJvrx|++xkont|_sJ{5s2ys@ZbcXolcshOxpD7nVhglbJ8GV z(r&Su4wI}t?zFJ+x0`fn)osy3PDk?wfwp=z3L2+0PV2feCVg?LIBRguq~GBDQt`Kl zxCR5^V%c0gV{k!$AXOKRh)v<}s(EoS+#IPMFt{YS%%J27R|RVwyTS7_eV%VOr*fI@ zAa6U`x+b~KkioFz1~(0ENk$kg)k|(OCK)FbRJOYXH<5MybfP)PW&E_{4ugU+#})`n za#yQejeg+e?EJs_@LQxIc29Dj2jQCNhHVd-5JXd1&&^3DnUFl9u7ZQh;l2;6dOVQfcYZe9drC@zn85^su>GTrGtefg6 zco{#@)9dAfd}2pewky{XWU|XsF*_rg}@YT4KFg lrcu2osXoxJJ~E^}Gp>rfQ(yR@R`{j9hGs=)sj5)1^DhPxk97b5 delta 594 zcmXw!+e=hY6oMn_)Kd}BpAfwS{SVRX!k2Ha#c%Cz?fs*n+)(=b=R+CTz#EIz?5nO| zzr`Aw4WbqSnyaxnpsRx>E&4p9(Q0v+wlGI%57R-X#!-VVJ?)yrOyassm?SMyqz$@F zG8RkeG3nKpvsNYV+iK$JE@#otF+G|$DCnrDF`zN1aa`+8n4An#$B@A(lhX#n@5{eM zpv&Nl|F&w@>NY3|5XAj&);fQD$(%UruMgChBJVvSf@a2IG>eT&t)h*SR6N$%J58k2~l#WnC}b6fNd6URpBAh@i@`1;Uc} zy4w@+ipjiP_@}o$*Z&&W7P=+5%^iPvaMh+MrUk)xHtFUiGfYeFa!+6+{=Z9dp9cmH zC65@DJm!hO@xNQn7RghdNoJXoJZE0w@IvxZ?_9C?sl~0iqMgbOc!@^ID_#pWYlHt$ z)cCcbiG@$0l|d2le}?DPPU_SyHmcpUsl5wRGA*1IOw~%gYNJuL6Hy(+l*_P+F{V;X YsxxougT{|UBMBf0iNu&VxZvdIrj9QD0b)21#y5H1CvV=L$(^LT{eSBV(983N8)O1S z+2OLo6_*kfhcTB6go>(5nlp;4>n$BkSnQf&LeZ!2Y(;ThfFRfSea!rezRgYwx-NO+ zUXSkug`Trvr5F?jt405OzM{CHxyh7fni=!CZ8S5@tmYOqfy{Y9F7I2lW{$c*q&2s> zV@}2rnY)^K7Bq|8)78WKC%@5A)02? zJuO-rYi_^jdr4frqC>tWA>Ys|-*H^NXIOq9lq<~0kJRKUb-BhTxz0Dse3zU2m0KpO Ze_2)h(233xM~QIC9!`g2Z!R%TWEZ{&ZZH4< delta 363 zcmWlVyDvjg0EfTR>N&SJhghVk7^Eu_v0*@L#A4`P4KZ-*QSVo2>;0){ zh{RxFATilkE&c%!*Z%#!U-JDFz8Bh0zqj{51v?qr33VzQi*zl znic(5yV@Icu>r-PqEZoYCyF5ff@tQm+L Vxzz<>O7PI&<|E&7qlM|i^9N{eT(tlI diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$EnchantItemsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$EnchantItemsPrompt.class index 062540519a147b93630991aa7f28fdad93fb9abb..bd83f1a05d07f63715c13e8cd8fd28420e366f3b 100644 GIT binary patch delta 424 zcmXAlOGs2v9EZO%kN>%IJ%XS@!9+rfATY&k27$B)oJ9*4K?K9hL}SAk_g)|Qs(g%N zrFA_$bb4to*MmF3!Gbo@x=n5b*W$`$biwuS!N<3puBY9-f7=b9hwq{5U-DDjB5)Yi zj5v%sjJbF`bQpIjF`=1sxxj#Cy1to+xB8k#n#Y=6O+K1vp4dkGubQ#7M7n9#Fvq;1 z!h-#gxLK%BH7xQ}A-QZhS13hO!!w>MREJ@SWkuUyb|l+19284k{l)VALcYJ~2bvd# zmxP)XgXNXsHE#@WSv9P&8bKIpyfeIK-i{{En-7MMeA28du7$^)_II*9z7b`I$>N#M zd{MZCa_(NX9NftJhOc~6^quw`Ta!I?EhYenCV*}U$yN2x#RuKnd^ z)ZkWY)112gfRuQ&h|gIG=#eq5$~YOB;Eqf&DbrMChPuqMBa7@xg`cv(iBwfg0_Dh( ex+tODHwV#eqxnj^$7Nz)^>KmmW2vkHZ z0xBS0kPk)hBXMrnOeEmQU~Dvwx{GIgo&Q>q-v6u)GeGnr8l8B?CjsWz$EbJK9Mjpm-KY1)a9 Oa_7?Gxl7YjiCh4vs%Cuv diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$EnchantTypesPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$EnchantTypesPrompt.class index 79118a4352cb68a067bd5ad5be791222004d134a..cc01eecdda5bcf526ebd4ddb56fa50fae95bd655 100644 GIT binary patch delta 1541 zcmZ9M+jA6E5XOHq**#}=GD)owDkcTE(Rj(SNw_4C2ncdB1`t#rU_=eMn8jp+WI<4L zy`XqS!>C{sFF^%VG~Tqg7OUGK|R{RlI9a=>O>yj?uj5@jiVXyZOMv zE{_@QLywQ>^E<(MW`f$-GP zM@-J6^jUryW z7ACvXvF5H+x+$6Jj!#s)^3mQ`N3jN5VBRDv&M=xDl(_5qifx=bh4v=zjL+iSLc@b?YSHLvAI`CCX?;A z+@4i&*%z>)Q8PKwLfA6CYAmLRRV9`!(v6QliX9&y=a5)7Q{}59231Cl=$_GWsb#uI ziy7Q(GWch`Uo$4QSfWuCBvd7H)kNAvcBm>gswn}!4$WMyVJ5RAa)M;Jh1ujt{Tk+o zCnOcCnI~FUvYj5OW3>6)DwPuKppM(*X7xcedq@CEvp`e6P_syLyCpX~CkZVUv&39Z z`q(KY^5wq8iGs0N#`Ri`U!NbdIpcTams+d+p8P8_bw#0~NS4xGMv0bpjA)kY8bVXT zdzd^v%k_hVRt^w8%ney|!HroYIPW-RHiN`h#*bhRU>)4zS$l?djSlxxa|uWZ$fS>q z;Kg|S$5*q|^d7sfBD-i^!{3hEr!w<7pq6t)HSoJy!5;$tORci< zRZ~FRHkn@ocLv1e32CW-I9F&%2E^qGDQy99=4lRahu9IJw_h-K37KQ~MG#Ac^b&pw z5Smhc3=j@cE@W6H?i`BvTRLfwo`kN8{EIfszd2hG@V`AQS)r>Hyh?p zyrQu2@~0A$W`vK6Er`}656?Uw#cG;mg>72IvT0?S$YP0)%Wv`~Ik{IPQAd7~+j$fF EKV9z`#Q*>R delta 1838 zcmZ`)Yj9IV6#h0%c5iMsP9{#qNvUvK3kXf=i>CAe6v~@QQILwD5}H7RO;SjT;43O1 zJ^{T7Qt<_16(6*KDNwBsR1`%J!MFbLkE1h={t_9Xp1tV^GCG;rbIzXgopW~gJ2&aP z9ap4|oIBVDpbS6gC`HssOH9WY#0A=P*b#SPIaVkwp&_YcyV_Z);T8?6l)YNVt+-8X z-mc>g+^Hd@<1XB-mU}d;QJ%FL)+u?fh9yd_*KnVb_op;Gpy5Fk`;dl*mE0h(QAZx) z%Gl(@BY0GUso^mVkL%csEz0?XTDEHFP{p6ru?@Ft=C29=iR!&?$>;~fS@@$aJB+~%nC9#U1_Q)wN|@n|$C@jiKea`@#3 zI832_i4XCSX>ecah$`{1#3wk);GPn1kA;k&5e+7rTdIwGhV1-|5l$$JL zKEnx#&vAl51Vf>4$jFyCsj}^oIE61HzEln57!8p`(rAvylEFwUVT9V-S|iQDWH^y0 z@Rbz!8pj#x%-yWc?Bm07zQMP28R5)j%w63UPDp%*?-}YTq{1v0zp*0HiuO*>hS(b2 z%YrL|#jU~E(&9O*6UlItZZ6)QWbigvo=CiS_KHX>IVZUy9E{d5T>2l|bbvM$)EYC- z>N(~jeS{{KhLf{`(XhE*Uu90s-Z-d~xD7D3TfHc0cG&1yYr!zq{5^Zn@Nu-q$pX*8 zc+#cPp`#A0xfu9?g#PhL)WGf$vReZRGp9Vpgd`!VqiY%c@ z(=Z)b7)^c5z)Y%Ni3&83=Adkc2I?s7D$Jrver!P_W>c3}Th(m+1mFVK2sF+Sm@9BC zqYh6~LWX&0Qq2LjU#Y|;)NhO5b9owrJJ>wGXGj{xtX|~J??HaGy{MY|cwazd1vIbb z72BEDJmo4#b@_C!EUR|;T>IhnISIQJoA;og7k0uqJVVoPT0WAVValKwr)M}VX}Hq3 z(q~sYBRUWuO(jWVWYYx+3KfO|{r`s91CCCV7pBrE8Yr~~qtXzb;!NfPD6ydzrSnJb zgRKXwYprCR{f%Bn2gXp!^B_(jtET~c+5h1+)_Lyd!hvEc>wc7{Q*@Tm8HCTCMnx|I z0~IT~=>F|cZ+;^#qchk$Ys#_Q2?jK$P6JD3p5k!7b{*WpX(wY zvwY{d`xn*-gw9~ZX*g16P}NV}J1)Wie`2s3G^$H845y*8QTOx?BMXTR-K5#9$GLEL xjZDNpL&ecTL$3y!BSNj)=y$V)Y{f*9Iq+rCAK-GjZX3cR;nwIcV>w=g?QeSaa6bS5 diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$EnchantmentListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$EnchantmentListPrompt.class index bb99de909b90452c834c07e8f4fb73fd75bfb9df..121213ad834d88ce35d5d89a8efc831ace599f42 100644 GIT binary patch delta 906 zcmWlXTWnQD6o$XGch}x?_8GCpMnMoOv}laAUQ!d%G-!zNg%~vw;seG8NhoQ6w3S4S z=>uACRV-WaiXaG8p_Ie1fY>64iY-#n-qb2+xl|}10tLL#x@R7~f0Fsvtba|Wv81CU z>KNI+1GrtZA(~RVgl8gBJZq?P`kce_5z~3W@M6SE)Tda&%Z68+E_Ha-p~0}sX>54S z@Va5S;SIx^5mR|9&E346<{jR3SYde2SyviX8QwRnHmq^J4?=3!M%=`@h(s* z3qAQRuG5KQ_J@3L`GGD=H$8E)UR~NvuceP4EkE(IVCOEFGp~F>%|lNtnp+*xZ~28^ zEeGflupD%yzd8I)S1dt+Kal8+!P1F`I2_VxIl@uPAb%ur@{?7RZ#kA&dV<;M;|ztI zu$<&nTo%qsck`#^G=B+qC3#EY?yw+z)^d(v%lV|nH-*6k%SHaq-eM-ngn#%~7&E_o zae49MH5HY`Gb*ZUEdMbi6uE)(ESDIuj3#4e4oQ&6DnX2bymR^uKdQmEM zMCx@^S^|-+L5}nV>PZlKIYHzV1ZnTS;4<%lAlG{&xWaoXxYFwn^1MMW7#pt`+mk%V sfpL@L<>T&^>yzDlDNJ}nyy%(<<2NP0w>0@^+Y>EIv^CK)iIQvn2iz?AKL7v# delta 904 zcmXAneQ1_d7{-71d3Ha~d7t;mL_|u(-f|igFSEixL@Y!ih?-GI(4w&hPL@PlLImxP zYL!_wA5;67o3mV6+UBd7Q>XSdomx%ZM}Dp4$DDomQ8P%#eH8l-0hPa zCx`7rEv>+v;?;x`t7h<0NQ##&uQ;uCcr|1OuUTFXS-=~q!@-+AIZkqRa-{AvGt+TGM)LH5+D=iJqw<@6O!;stfC}cH_mX9rK zENk80CoagRA%=AU>qG9M$)#y_g*I4nX*RMc;B)8Q9PmZRRGI=>LZ;DV+2+jK16o~_ z9RWMtNV^=qbok2QYs)t`TfVilS$13YSlTUn1NI4i<(#sL{7FJVJS$z0dr|sC_UE4T zCK&lHuGVoy-$(pFN5laR3L~fFC0cb0p#@9Rd-@T(RR0y>!HRe!llpqPP2t#`W=Y!2XC6oQycd=_FhxIoV7^ ze`4wJi_&Kp2sj(@3%|zq1hee{ev9~>b8%hpc=|%bMgEBRGco&ifiNA7p*jr@m zW&Re1%`Ki^T<~0FS$V+&WfheX|1cnA<3h=fjJU$ph-(Z*{F@BH!y<80sx7xHTwwBy zP!boWC*>Z!?t)1zL3Jq;b$RZg;e*~|wT#jg+^uz#YdzJvl6q~ROIOMDx>{yxqdcW+ zq(;|Cv#yu3+H5kq!A#eU=2>kqi*>8ntF4~s4sX2f@(Q)htJdA#HrrU3=N1eM#FB^y*2j=_whbr)7%v%WOR(B|0GG zdQKMVdD)~FWwQ=Sw_Y-$mrb5tG5LDcJg7rvmM`WB-1vz^q;?fXCyHQ!B8wF5{woMQ4^y^!xl~^M!*FZs#Gl0R!hMZal;K1 zaKsJweZd8)7ZWvHIe9h4qjzuKj2#m%&&>P1Z@%~YRchw<&;0rL8K~xi#{!xHIW&7L zrbV*JBafB#tJ?4&I~lwBUXX}8gs%N{E_g6t)3(JAS&PQqoM zM*&Hfl-2uP4tO=B>6T<%dOUhL=yJ&AaF7y?NRHZ)V=jGOE_GbeZ}ka_lNP63PD{>A zPWyd%1Cq05#y24|xi-l;(>LpT|9L@CXS6q3m53%gsy1fQ@nlC$Pdw2cOG_>&E;6VX z;*ua33D@_=l9}#s#IvKzieW|+qg;^~#Z|^6*A&;eA-Soz#kk@&g90ZKUY|@I`>v_zear{lr6U9@WnKpm9GoX0R3p3=e za9;9Cu+pwDU%X=TNvOGs30@2QF?*}x4Q~aJ|A~CXJ0=xVWEGXXH+9aq2w68!n@Xh8 z&6#*2`@@;a^XVcp8vI$PODNPK7U@zNbeJw(#+Y819a7VxMlZqDmCVyi3F&I;^)fc- wD3JAHH_-DWc50}>RP_(I)3YVF-JFuD&1&?XJ5BX75R;S0RY2>F#rGn delta 587 zcmW-cSx8iI6vlu5$(jG1JBI`*qsSV1kRqmm-h36TAP6G0#TF;MP2)1wI8LkCV#~Cs zc{3~9%T~)}dg?)tib8q_B0{W}R%oH#dW-JAm+zeKd>`jK$DR9oPTTn3$D_bvayIiQ z4|-5xvye*7YMVSNgA}vIbZafvnObFFz3q)R1lh=@Al1ZdHdAA)wHA&cTSCOyY9OJh zGfKThgUvJ=Es};eS!}aQ*-lE+Y>~EUA!D(_VrPii?9%KuA$u(L+McUbv(NB01N#je zusEnWG(6__<+W=LyW_qA-Rz}lj<~H;CfklGX4J(pv1mgq8IP_?rxM9{X-lG^)=3G+ z$O^|fp$J97Wf>=#ZVpFmGdd}pqC@DUOLJQ2#?_n=dN`};70z*9xIk7Bh=f-(B^{xU zi{1gkB_mztiehG?<94fpqW_zPtH$n&goSH#D3lj;ova)5mj`YLH|ck4{KbKG;TE^u zPXGMC9quYh+%8ozUAV`6h2Jqp3IjY)L_8&uFFa&W7-Cph#E82z(3kV+p*)|Ax{pGi z3*`xg@{|Sgj3x4%dU-*Qyvz;Cm@1XmSn`Hh@|Gf*piCxNDetI|_f*LTs^z2i&?oQz gFXZGaujCsO@|{2OLlwwR6_sD^$kbkwv^;;=KkoRAoB#j- diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$FishPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$FishPrompt.class index f5004bb5ea4fc9440908eb6e5c1dabecc3774c28..9eb58490ed4014a2c83ab8c4b3beb0b01a0f54cd 100644 GIT binary patch delta 373 zcmWlQNiRcD7>1wI-sAM%9ugrgG3?lh#7ZI*HP7=@LrtZW8mguu7It>$e-N>=kXT4W z;ul!@1(r6VXY;&Y-uLYfOQ5#423CVSTW*J#%PE!yN`QJFsYcb<+R0&#jM4g3NZh8lLCgoHIcUU%ePF+EYT|tu( z!FrPu;VR7@X@QeS9_8hI4itx)BQk<|EBTsZvYHc4HD{b_YPb;8nb(2}laxK8I&YP_ z(R3<(IF(7Jp6=y)Q0$l!cSxkooBLgRjFef5+*_Qd1F4k KZ2qe=-1`r?u1LuM delta 365 zcmWm5yDx)L7{~GN+rGzX-yRYnDskD^q=`u))ct#b_(%_R~s*d&It`6ond z2BX1hG+K;SiHM%%^W1*VL-;m)_4fDt0(5fWP)kp+La##;QAwYJO*BXY{iYiTFlg$K zVc21WQHL?cB@-qy8DJ_zHPezAr!vn5m^1fzhXocTOJ=!jSTU>`)})X1$Lpfco{((l zAKypYrbRfNC?_JBMAnTg7V}=#9VmI3@vCRDE|P*jvCD^596 zv~sTJ#NN}pc=cN`eIJ~*;`%H2*_J{Gmm1+wC(=a3A>ATFR2&f(S&|~hjmYb7r(F4R GLu3E6mPqgb diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$KillPlayerPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$KillPlayerPrompt.class index e453182d66fbd99afe82b4a3c95a29eb93db83a5..79b89fee696ea1279ab88f592a14cbe4e5bf6bf9 100644 GIT binary patch delta 399 zcmWm5O;1xn6vpxYw0E3#I+&Oy7Bw_%=#JF5B~Y-uX+=@2s32`=FH(D<(3UD zCdv@k-Ik3o?Bk3g586Q^lg8 z$}_v+b%kpb?7o*e7qBE4uo=~BPrZ2eGIfDo2}_AlBud+yPMG_eBFxY(`1xHeK0q0n0K{S8}+ZPChAN>NH7QQKIm zBur;_Bh1FQI5;}6_%|4LRySkM@_F8V&r$L)`R?f7_aDF|wlyPMjt`mCjFVMNX?(JA zPIJX|R|BS9z2=zF%#zd0F|WwGOd;TU$VrNd8+te|1l)A@TbkS4QQURQdye~#2abm- z#-lIY_c5JUJQg6R+KRepGv0w%w7o zd=ReM1~Ir18W=ZXq6<+$NJA9ErT>6*-TwG}-{Q;0u44N4-Bt#uVLhdvS9qEZx;44< zNP1mfYLfK1)N7vcO7dD$MvG+N=i1{3k37j6$)KcF(k_Ynh-65Bpe=Rr#72VOgKq_e zc0(5CNQMm~j2gyxXU~Gokuk;%@A=?c3?G@W4NiGz&@joAec=>Gr5U06@=;N$z*AR~oTF2rA-G`XE@G1kr%v7zB$$CJ9E;v=VJhv@x1kP2wv? z)7$z2M^{0DONT-x!T;bONPj?oKI za3P*f4t~gHQt9M)F13)D&q&q{8x##CHtmCVI#A-9VT*0IYbaB(5#K9+-cV)7e)jbS zciEHd8xE)$4xi0BMSJP%YdhlDwtN%q4Za&JKLlO2<>|5m{-E=d6T>NIHsb#)!nV^J zZcfQ-(G07A5D7b`qaxL;=?O8qgrhQasw^RuV_4;hr~;E}okg`lL2Xi1Rrb_22dd1i ks?c(|JGIXrRc{(2pL;JmMuIWk;UVhIBjC8pVyxi#56weY^Z)<= diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$MobListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$MobListPrompt.class index 3ea46b929f379b7c41f7fdd916520e2fe83861a8..96b41355efd4d025b912bcc7adb461783fb17c72 100644 GIT binary patch delta 1210 zcmX|=TToV26vzMTT)wl``3@K5u3SE#G6N*Y3)$o)8i_Hr94dy!nPgxZ3wBjMI7e|MvRt|6XV9huv8; zROI&F@9GASPjegG?4l-YaS_C4jAqTPTDG|;!*)iCiydecG+`%Wmu8!mb}hRZdo=el zIusi=CDb#zTohqn5T)23!~t|``I2!^2ftz*Vtmaw%s8TRM;#nve8cEr^lGDzah!32 zaZ*>`y2!(KdYn^?(~L8We(j%iVc>fQ11=U~P)|6d+yB7z_%Vo|aNfZMof~#A;-Xkb z%5YI|38M~v3F0z-b#TSSG7K`VI{4kiatt~cb5WwL8@lBm4*t~Fxar`QKL3}NzqQ;65R+Hv9pxK@8Sf#D?_)ksV1)oxVqm>ks23ZbN&pAML5~PV z#Ko9+xGfQsAdxgnqG+K^qNNf;uShJ_NgRDB@w7z}X}3(FPMJz)C7EtYiZMx2ja*4H zmPp8WL(+{p$uKsROP0|j*+!4dF#06VxGMQ(oXj*6WsX@O1!lR-H7n(5^KF@D?vVxN z=Tc~%mS@dzS!7N~v1Q9*D^`|R(`Bi(NM5ii3$g7(L&+Z|0qO^U4m>vOZdswT`WV{4f$ET3HHMnm}rlFfzfRg(4jwXmHd- zC2=8SL@{72YejZPMaw2T1w`4TfP%FkvWhGM%HqA=ALrbAa=w%AySevR(b^(+_ubl! z01BngEVt*tGE}<=V?MFK@InKNT$EukvBX6UJ`3r?QsQ&N%M2_xu!2}=conhQ@EXpV z9!a?se1CX6 z>FWYNX)64#LnX?y7~Th1-MDv8A+faMzR8(#DgBWa|lhz4Coe zaztesortilv@Y1aV^Y=eWp$RX*g?K(`%KwS z@O8VAZ`(6D!(QH&@7O!|u6>&C2U_rhKu>-ci1DMq9L~)&tWC&|z1lQ>q*2`>e zkonvsE4f+La*G`1R=LV;R&#E*qTFE>bEj3#UDj0AS+B)-z^dj!tB!}QJ*>CR^Qdag z<0_jcR3DyHF*c|;PpLO~TCL(4^##wV13a&8^P;-P%XWZQ>{h&HcjI;YDc-Qh@TNVH zckK5InoBfa&|Iqd5-jPY8O`_~wums3 diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$MobLocationNamesPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$MobLocationNamesPrompt.class index 24037cecac5993a852e5ccf73476c6c5a33f0cb6..8a7f37e34444c0aebd5388cee8089acffd49d01e 100644 GIT binary patch delta 318 zcmWlVy-or_00zH3ewN#8Aqm82L=!6-f>8?-V`8LL8e(!Hi0g9T!QP!72jXwEHL)<; zS=smi#?BZXz{*#^H?X2pp`A>om_d4&W}m>ey)pbh z!LGgz>QMG>94l%j$NB8X%Xb#d{oF^M%b7wye@0dW-^%GsQJ z1#uJU130-m`4A!qigx|^mj9#BD~Q+M=N>S{Raex89oBPf2sYWW*cObiV6khl_jvcB zYx`;`^Imc_hH7rxtwe58t*kZcVNzXeg^?fBEe<3ez9isKtr*kAfU4xEUqXD1te3{I zE2-hDdt+kom`KC)+{6nai&&D7syAbF@`O{1x}-r<(xNRnqoa{O4x?x}_1tEdCaZ27 zG%U^~7hJ0G?3Y$nH<|L&jQOA`Gxww0pDJs2bo*Of+qZcQTV%)!gE3(;FN7+JR^N2R TT*0A)&MXcLrEcF_L-aU(_~ diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$MobLocationPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$MobLocationPrompt.class index ea8d51faac311412c4c65a0ba8647aa2e3b97798..4079c4efa3c52a7992505f0f088100029af73e54 100644 GIT binary patch delta 493 zcmWlW%WD&16vcmEV*Ab9d?{^BU(hb3AcBN|xO1V@g$RmBYavjGc{NTmW;9KzwYJv! zwpNYf`>hLg;YI>31VwkE3*Gk*(1jauBT}t1o5Q__`#Xz!zV|N<$ftjA-T|9<(vWRq z8TQ*`$;HT1&=g~IGA?8&SsW13IGPEehrL1>H=GWJb|nNnn_&)F9FAeAY9=)`VI6xc zrZh)hJ?o81QFAni&`kRuqstqPDS9TdQ`wZ8t&~#3wW?Do4b>gDPz?AP!*ON}bDZ!$ zubF9|W8QF*1xXm5I7^%0L1Tm7%mr2j&7`lZ${Y9QDW_IA(ps{3k=+brl2rIO)E^R@LfqJH@4*lzW+ z`8+nRcK*h)|IlHtu-^X5Mthab5@AH5OiK$3VzDGPFGYAOhW8R@S=#s}9sH8DtVoxN hOSkHiK7Ta+A&Bm6+tQUGNrW9iYqVRz|1;Ey{09!ddB*?% delta 475 zcmWlVOK1~O07cJBY~H+?7m0$_iY}xef`k!q*M-uJ2#UxQKTyzo+BnUaXqr@GQ$O`@ zt+75o^;<q7TkxzfE`Db8#zm&?6pamP0P*h(CP zI7Y@HOHPt^SWTaeN54hE<_O0nzD+v^Yz8PsE{Nh2(V(QlV%g%PgXWZ^A{n&V#D0sK zWN3DJT|AYSoDLC^GXexTBkXNvIsRr#UC=&|8Opdprc`jfYQ--Vx@&%r?+Y`-s%QSYd$8AjE6#?=RA)GYI=#e(|ClKRAN^_jnFj(_TlNUC|!p%zR%`7K0ut?XLk RktW9O@On~K__jxt*nb@gd2Ijy diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$MobRadiiPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$MobRadiiPrompt.class index ec430fd76cd39fba91c8a9b35ab8025c94b64304..ad7ed19aab043df29d81b6fb7b5805635c22e7f4 100644 GIT binary patch delta 385 zcmW;IO-oc^9ES1hjLvyZ{~l2nBV@h>A;@4OA}S0xnYajSq2Ss^9rWPwoOH&Q8m&>w ze96ilEw#RaiVSUB2(5xv1?^hr2k--kNB8&dUR?jH*Y3)%%hNNUm2cZJ))WZiJQK>9 zQcOE!1)rS5j4;HkVoqpaQ1Sfa;9f~ppm?FkE7FRLA{i3Jg85VO&ssExr8T!-YF<&$ zEU|3Fz0&3f;zIyfNCi|xK(aNq~4^YFCzDgTk^>2k~oeuQz;3mrG-vu zBPH$hN(X^-l9wc_(#^Vbu_-CO%R_#IyPwj_xjZhGY5V3fR+fzU#EI}EtVx9vHuRY% Fas`%UU0MJD delta 367 zcmW;IJx`NS9ES1hY3XzNKO8L#b*ND6VnUjb#)+gx6B9QaO5)JTl$U5DvsF9X_G3#& z>$Kr1MMH^aw%#(@R^qwg1v8#A%ra+Ffs5{>;U)8SI?x$j;FY3mc+H~W&42lpqWu(z zy6;$WxNM`U$5x!P+VCE0SmuN6aN}JotU9#c&5n%pwB)p0Z`P zW@D157Sx7QO-ab{$+jKPeLne7-PG5dE3!*a>a@!q5!t6#4!9~mxh}uR%WtOSkU2SK rK^l~$$!9sD=Iy@82~GJ^O&Is|viD3foFO;!kM|Si!qCZ@ebW z^)TB!+UXS<$b`8OVJUrve#3xAf<1$oK?eePEE;q^+norP%h~C;&iQC)SKm!PReE7 zD($*QI&?`o^?SLZzezXi{qti4!1Y)BUVM$Pq^Xi#swG3M^s!b3sFy5zB}bR!eJ>fZ dGU6sHKdMHTty(=NO&yw@q@gnG8%mQ!{{>rahi?D? delta 452 zcmWmBOKePG9ES1d`_4Gu`JaAb8kZ(bDks6zXb){w4J}g!%WWnVei&>!y!U7j2L6A!W4X&cONDaWI;T%L_bErm+#PPo@_>g?)y=qLmMI=Z zKi#J0X&xJ%Sf29C@Z9o(mzGz&w#@LxQsu2>Hd)A*9WAK) zt%5jh^UjH7ERqau(oDZBXP;y_E-N@IElfx&RSEelD;2UzHA6EO~i)FpeNw?l5J^G+*(5Gah9+teWNU#1NoAg)N%$DTj00*Mk zdB3v#c(RpxDbOg}$;nQ7Wj6&G;E3$uybLmu_^1p;KhmF65Y_6t7Z&M5vp>l~+Dl3l HxrzP<#>j3O diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$NPCAmountsToKillPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$NPCAmountsToKillPrompt.class index 2d6a5c14c86adc59644f3bc90607d7e4bdb64f0c..ed63a4b5d0d7e2ecf4e35e55964c606cfcb7bbb5 100644 GIT binary patch delta 1287 zcmZ{kOK=ob6o$V$Gnu~AX>~|KaPq(ok_7S~A)-Kh5lGMwjSzzvM06O2Ffi!}$s`ha zOdyH!P$9O8V3ixoN|hS}=m5rY=SEkqtkSJ3%5_R8OFTUjP#13Q`TO>N{&VhsZujS9 zx5_d<{PoRuKntIkMCb|0@}kKydJVRl1n3R%5<5KfvZl|AJH6!<%`THy*{ylai?16* zO&*}vWDhZK+3P*VP4?06N$mHQgyujY2T2+@1}V*8x#p0`07IH#kDE3aF|p|}cw_p) zWxq2Ra~B1R-QB9~F24G;(#rkWcQYayhYiLI)=PEKGk8;hBIceCHM?fu;(gWBSUk*f zi)xOzvw@1bqZY?FZjoVJv9rTT$A|2LiDc4_4x~n$^sv3c85!6U9~xfi{vOz{EW-(l zlT0Xrv8WS^OXp)2lT0a;ZSfXwyWItmEvGC_bH?HJ?{ZYqmt}<{fKHx)xj}-0hA+_r6Noy6w2co0VrexIVZ|XQ4iw~v~ zDMxXCr!yK&CidEKCp|P~yR!w=l@=HHSP>S-+VV%~O?An^EG}}%Z42I3m7-k|+LTJB zhPI~@$*T$DTU8j?+S%Qu@b`4IyUn2<)hMJ!cRVy*9+6uhZid62fr0|~#Kju%x7KYi z%WGH2UQnLUDOL)$Jd8;ljS>~BXv%RNvv%`8+~FLzRJ5RUf$O1WRtsCnMSR4|0-qnh zsKInpK(4A_a?$mR23n*ID!_C6Pc5U8g8Z@s1hR)n_T0BhYt^f-5Y} zVnlS7&=pDr7A+B&#k|3TKIVw@)qREU8ftcij@HnBGIR9uT;{(;GM-As|ENqFYUa+a z`i1JA_H`?XbyX!Y}IV;z!@ee6MH?Ao|2CSJw`|$A*_!Q(Z^`fCur3t z>C%&=GkS_~eU=G*iYa}X8~P023+YFFj+@%exw}t%n_>fNc$APh>hc(C(Nypy>sU_# zReV7!kIVd)Gs6>t48r`vlk(Otzkr{lk*B34asS?o=5sU3ctf5S@wGC-Ho@N5^9dUz zVUz5v#<(N8+MwN_!(g+)GX~GfswDYOYGiB8MuX1VwEaQBEtZCnoAq3N?zD@rUu1%H z^)i{uf_yn^@^@`p{<7J5%Dv`-JTE1^-hy=Vf~5G^noHeAgT%7ju?DD@{Vnpp5p%I6 Hj^g_p;~4Tl delta 1207 zcmZ9MU3U{@5XXO;CV6%@%Mx3uq^S_Fwb)WyS^=#U8`}_KwT9AKtN0Q_tfgrZ(@;Sz zQN$N~tGK=Z7o6h-2d_L(JfXJg2k^#^z&G$(xUkM9J)qt^GtbO_{?F`x=IqU;OHJk9 z|6chG=;6Fcm_vpfVtijv7z4k_l(UbtE}k{onK zv@zFSyQGD+#%Ya)r;euPQ(f6qZmKJhD`loKMdugKpA7}Yn~LL#KIueWRh)2st@~p` z3#}I0xzD17x196d=E&O?@33HTlCnlJCLG1c%yc#zNzLYuoKr^kwHdXd1?om)LmJ*>Vr1CqHb$K#V=)|-$$}OPx{`?J z#Ur}3qH(`-*bKL|Nz5-d>>cb7-*SCS9$=?fjZPk{VlSF)`|n^otJp^2g2r{M>vhpB zXpLR6Uh;wv+@Ma_U}a~0pn`RQADlp7TX`zv+oXE>^pL*HUCY$>86j`TsL(KRnOL9E zQDM_6-pT9umT0V?>hGywEU{VKkY07G(U7?mJ&M#2w>$PTBKzm=mY-+nOiGD|gVoYeI>a_fL0I%@m-w()g1Y<|COC%YA0zM6 AKmY&$ diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$NPCIDsToKillPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$NPCIDsToKillPrompt.class index f679b796e6d694ba4d730635281414aac19b529c..df0b5080095405181fa4ae42a7b2b0bde7debc7d 100644 GIT binary patch delta 521 zcmXYuNl#N@7=@qjrtSCk_H$S`1QlXTOxPfXtwvB26Jvu|r~^cy7Hrzwwpa?z1CBUQ zt=AC+9C5&b(!@m<{s6bG)s+i3{siN_>gqj<^PVB+Tm5K*{rPw86VO7nY{%kRauM&MB8oP{jD$JB5uww+M}=b%j&nkDQgcc;Eu68*a#k4i+2=IpZPwDQxmd1L zg1N!u_I@{|+W(dWMiR|V zBA06JEEdwa)Ry72(?3wqTr*r}+)(0%`!mq7ro>G{nOllbGLcITIG%yQ<+ehtHr(N^ z+Y_v79W&hHzTp8Anumr*OlqbK(>yjj;i=}C;W;l1GraU-8eZ|*@W!{AW!#+$t_r_3 zyyLy1%}cuOe?tlNtoXp3!u)MK)Ro_nb{s>6c}1&FbZ0|fRlSFngtz9Md?8*;JJpXm zrc{&PxEc!2Tb68gYmulW+p1#rs!b9lEbT0oozzJOEz-qC*-c#b&?oySNjDR6kV)Ck qwDj^t`uOhge#jvekc>OE;FqshTDW0pmi1V~yrn!fZ=Wm|u>JswynrkK delta 516 zcmXAm%TE(g6vlsd()LcLx0gmE*bs5ln2->Hveg)(Y#Iq6MG_-PJtTD z_yDwyPZaTq;*+L37A9`px>i>%-1rB$P^WQqPIA8UJ@QSrecNPx{&Xz4XT1j)+uC1yg)#46JH=~ z#Vv08!{MYeqqxIe#XasT7I+|es95BYVu{C+CyJ*$Q#|KI;8C&6OU0{(&I+@E9osG0 zg<{!u?26;LIXj4Fr+T+YUMt@4R?ri;-)RJqW0B#Ocf1#fz|qC zL<`Z`$XQ>JX;JTpt{O)CxBoTPXT<;3JJdn3M~8`ONkW?>b(C%$XSZ%*NGCX~*D6g1~AK?xOE(p7Xr$d*1gsoi&A;-1NWkNniyNE(_Tb z^rhZq84bc#mjDexVr;X{b7-`0+{$)`9WFabI5aslTbmSixy+-%B}Ljwi_21Wmy)5? zj%}r6X}8E8m%Z$>o7e1j*lf)Khl8aY;;@htjyN23IA-(59Zp#Mq;Sg4r>&f^a#lDu zG`V;B!n{7)ZYa@wNbG$K zxx-z}J?;w+G`&33^zlgO*9220Q#Om)QR_js z%~E<4J8gXQ)Y5@t*e)SzX3Rib*lm+wkB}644NWQ1HVyRH>?LC$YkS_lI`)w>Yrc*G zMI-6A+0Ox!y#AoD-H=1V;X00RRB=pE5{?T4#(zRMY2>FAr_FxGz*z(56z38#YV4!;-cqQTyp6KP0~uYw0Xa4XGA&}m6eRk5+-CB-(@*JJl(8>t$?hu Ug0k9LBWvBc`d=pb=e#Zd0I~FgPyhe` diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$NPCKillListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$NPCKillListPrompt.class index b08b297a749159143dda8023add078cacae46958..ed55948b996b8b14a54fc0383e578907a3218df3 100644 GIT binary patch literal 5912 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 Jfo2r&{{e?EdSw6r literal 5818 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 IM&t?q1rdI3vj6}9 diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$PlaceBlockAmountsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$PlaceBlockAmountsPrompt.class index 65c95256ec4e85fe0e4202aad63cb1280a74d281..60ede9708532b05e015c1735d65b23260bb60c23 100644 GIT binary patch delta 367 zcmWlVOKVd>0ENHFB$?dH1cFToEfz}ARmdj0wu>U}S}Is@ZwL{DBsWcNe6%r1jnO`| z4@awwEAbadR=Q|F6iN$XT`1aWvv48)2 zMVNOfP>xV>xrVQ(x{NZXxcRzsMh;l)mg2TzT#>PgV!`y}QE*X^Fg=xsDr%ZL)HMy7 z=3VgW`36gxyR-!1Y^Ipa<*l!|M_V99HTQWSh?|m(pHnPrR#?@n@lf-Kb-Sk7U{ka8 zzw$A4(+Hh)jOGbX72D=zXgl$Y=K@{IXR^5q1+QB4E1DfTuP%j!7%`W_ap$6!_sUoN z>-la?4FyEXhACs5L-F3^+*z^L?YdK9{3DM1L`)tsBtMguUzm_znUUY{<#(F0PfPxw oEr0Sxp76mk2l5wxU?C(7oi$BOw59cazu(X6ZS)C5Bp3)H zghUxggu(1X;M&jm{gU(R{q#ByKj#-fC41{mw5UT7brW+FcL>tyrpuv?gd*wSr$y0o zw4Wn$E!L~(Qv?(tt0?--rTh>B<{-_NIj9+8STn+?xlU^>8DUH_&V(Q%9Eye`?N-%H zG9?gx%``KDJQJ6B#fn+Y9P^q57Bx#O+at{itD3d{$#sU!Xu8j{p)qU<>Wo*Fo7eP6 z!4}&B9d8eXBefl|?r1Wh*rva0igl;Wb^79-nj JI|b>+^#{8qS-$`P diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$PlaceBlockIdsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$PlaceBlockIdsPrompt.class index 3f18c818b4ca54bbd2900168d7488e186f13aad1..82eeaa6504e100d6b62c49f37113fad4a91a1c0f 100644 GIT binary patch delta 401 zcmWNNOGs2<97oSLe`mgX?|gyKBnTr4B7szd+j3JBw3tocLXcpXnMHERn$aGUJuDwn zRyKW_Q@*CDG|5GynP8M+*rH9lHqxSp(2t>UP@*B05y#ANTHexk9neq*((w|q8T$hrKovku#6if zcy5@aWOzX-cs0Ca$}r84&4(M^8N)1dnzEe>pOsg^x*P7UtMFRkT=tWx%(-;V@P@aF zQ^mcb_GdV1%aLu>P~3~Tr+fUKY)9`!f5qyqkj?1h_OJU(joa^DLX}ox(Lr@)7FWvD z2I_jL&?fV=%R3UX$OU;%zbsLZ4^*Yf7g=LdKC&gN?8_$=l8SQVvpOsr_P6;HXg3a= UIF#iWAre7cYMmfymRp4W1Llot>i_@% delta 396 zcmXYtyGxs49EG1ZKa=;%=PO9nLLs0aA`}tp(m^{YICRJ&bcjPiqKgDkQ?IqHtx1j7 zn7pm2ns{ry41!vx3X0gxKfuLFH*xPM{RY=_&T|f&-=TEKy?i)10~-02apTVif<%Zr zyweOi3^@$Do-pDt>Jnp2^WLSJH<}Mey8$U1(0tT<(ll$jJVY~L&*fTuw)vt^@fX7+ z2}6>v_HR*pO_C`?ifKh4+SwcJj(MnIhFOKGGR!frD7XDmUZ+_wq*>Ht3|Xw<8{Z8} zwHRt&2o?3lkYm^TzyQ?%F@y58=qGQVNn^X~mUPdC_9IDN6sX!q-`xM7Q* ziq^-VYfl2k9t8f_+hD_SN_Y6|6Zc9b?VTG|)5kB16RIsuP%@NCmSQnXs(z zR`QHXfs|}=BwL)y9_O;nh3xQ8c9l=8a%5lC%3-$T#%sMTX{v}&kB_kTE2WP2W`uEk F{{i|gW7Gfu diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$PlaceBlockListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$PlaceBlockListPrompt.class index 10c8cc7b37f0e1bbcc43d2708270909ef65205d7..fb6629ccc996a200ebc686f424ca0b9b5f141443 100644 GIT binary patch delta 788 zcmW-fSumAh9LAsb`{#V``Ocf6Xr_xoHRA#?##FSTnbK(LBCX>>Xe>vX&ap&7M2kdU zRHU>iEmB9aMT<5qqEcGWqV1xarpuP^?dJEqGw<^}|Nq6m!neg&>-p2x2_O*P%eASw zHrO?Aq;aH6&5+2{5P~fnSsJpj)eIYQIJQa6mB^FG=h!Z_fTNIO2S*V{v1YXHv|tu? zS+E;>BuZ55J^=)+DPF1^zE6n!fC1)kx#?re%Oy}$rNs2(uZPp>phx4aS<#A|^!Mp3V6iutX; zI}9;|{dah)wG)Ri!r+_~lOE%rW>2*GM<&|r0`JkMkEns;KH#IkCyWYw#utG__^MCi zjck$;cQc2lT2nVi86ihMPf^%6#{!E7nFHWNf$*XrM}qTjB{UclCPj5|B2m(1ydGVL)ol=a##`Nu@cH> t^;E!qQX%_G#d?ifGb_=%+`aW|_i$Ebyu!y<8CMo$9L6a_Um6M*{trq;$ZG%q delta 811 zcmXYvS!|S57>1woe{}vc{~Q|{kt-ro3L&8#haf04VZE>^asdLCMk_XTfYPxFGc5%y z1&c*3Ao#OZ%4S`VMRb$`#mc5EDyt%kmPJr5h+G)MmCJt!=i+&Da^Ca4-^I7LV0D3a z^56ZPz#wj~^zs@CNqK0}ni{LM7IQobsng8$n8*BZaCuErZ*_r1gT+G4BCD@!8a0bG zZ)lplAazNEp}ZO4E#9_hc3G-fX06LTa(TyN1uHf0YJAPA2F+^wYmJA)T9`S z_w1Jqn$`##+2pd>+P1iC^%zWxrp=l@aQV>oedO}79eSI^Cl=c+c4&5Lc47_VJ5UiH_i`eWuf$QAOk8#;^@ZQn?a?V;8urj`*vmdePAob;SzeKdj!C{! zQI(3uJo~WU(7^%2S9B`$tJYBbQp)9P!$A%i4%4o{aKz>uwfKg1za%SHz72GKR>{a? z9CyhWPH@uj9p48{Gs|nss>G9&~bYgm9b}(u*II*bV2b*z<(=KNWXF2ERgeHg1 z^P^(4f7itP0dB-^3*|*F7=GrW;Zjg@F4QM{*>Htl6k{H^Huw6KE=BhJu9|dZGCr;{ zl{Q@Ev?69rJq*{lZn(j3hMU|n6!E*?U+>P`(^XElKNJ=Igog%Z)rP)AuJPvs7dse$&8d|DU%W^rIcEEjs|(2Rw<)HUf_~U<(9n2pOR47 zGEF@xGt@AtQl*kqjZ&?eWR_Ygv(+|9tG}d1{U>$)!5({5y+7xXnQBqM{(iV;uZPzM R%QraKm-hqxDNwrW{{dY%$d&*A diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$ReachListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$ReachListPrompt.class index a88a87cb5eeb0f2f38b3f69c891425fb42167816..9b42c5d42a100496fa46deb85221c47c95c2daab 100644 GIT binary patch delta 932 zcmW-fTWnNS6o$WjPG-)Y)h+OVhQUILCbiMjNkA|Wo7xaUVj$56V;Y~vT4lKzp&p6!14{++$nzp{4nFP_>u zReG;vo4XBD~2KyTw+IZ3S#+hsRD~8g15=)4Wwco_3Gj*0{&xZJ~@dk9UM}+BEyDdA~=e zU8&3CfE|0#;$4gP!kYIzKFHsqjH9~q6>hPk4*7FK6G!!Ud}ugKui*$s{cI>&c7#5| zNAw$x@v&l5U3I)_?(9@mJe^3@)_WW`oZu6~0KEzfC$0HYi&OOa!=XvuXas6K{;i8q$emY<8kPZTN#ric-Hqm5w(2$zO)QxonujKYlK< zN=*nVVe>lpIhC5mP{aP5XpK4_@OpnRI!lcNw;TLB#}{6^D@b@* SkiWfwmIvAq=*2)8qyGbS5D7p4 delta 908 zcmX|6566o#Lf&)#qD>9826&{FUsrV`0*BMO*6sSP&71PP0XfQDR4!IDCOmPSRr zP!PdFp?u0Jo77#Y^`cc2TmY@CZUtpgQB`u-^GL_#`*F$|l2R!;^+B?z&#kJmq?L zI?6LV>$-T(=lOJA;6{WD*$3~ST zitmXHD=$t|mX=Sih{eU#_F49Gz;cj7iuSXd=YNaON0yKI#PTW43M`+w2V0yRra5R$ z>**Z{**;R!<8!|7*=;$>G0SmIC?c_N#bcH)LrYU+ruS9IKK{6juQ_S?hHrgNS-#_Y z%MY9m*7)6{KU!M(Nl_RSs(8@m=SF_EoC#wwb5-=L{>d z$~dva-8v4JSE2oU^8o1tH%E*%p$H=0DZU=GOoK diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$ReachLocationPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$ReachLocationPrompt.class index 4256543d9fa819195298453a8133ec6f34b5f1ca..f873a1f39ce114b326bea0c0f60afad7cbbd75b7 100644 GIT binary patch delta 476 zcmWlWyK7Tn9EP8h+jnw)Uu&u@-jbpeU8F?B&Be zQZ;^FT5q+BIJlHJ35tS~2>t;2>(Uy*%(f!~6b<&nKKOf8TuocCplO_70^v z8O0?dWEoa?!dh|;X-?UUI2^}Uj5@4mz#&heoyOX@*e;Z!9A(^QLeP{I6-CuyD@SbV ziqp%l;z7q#oM|Z(ljdu1#X4(VhvIThGsU!KhV$lIXeu_t1hUNCLKk-o?xFD>>pe)gNih%%YT_uj;q zm&_F0Y`*UK#pFcIt5hq=1EoT#e5~bej;le->{mORpY5f9wQ6#5*!takD>>`XKWwq+ zk|5h9#14tDTcQk#!=z|tWesx@=DPe#iz^WfOlSZgoh)+9+F0w&PPv Xy{&UkPnv!L9BiFL%x=w{rbggD$GLNr delta 435 zcmWlV%S%*Y9EP87M&~>J&Zk%y5>AT{+QcM9yEg4g7zr6Skx-|ZF^`v-bVkb>H7{9K zHrdz3%#t=DT_8D7VOJ>#Bxu>fKfpgA+C_9`_ww?-&*E9w^CvEw|JFYNhghDMqn#;E z*Kh{Uj>*hRc);qm0>~Ri*k-#tm1P&`cVpn6{^?o13m0 zX1Hd!&aCE!;U>22V#v%CG5diB1r2F6>K}t zB5Kjjx@~GX_~mw~))gFCWrsXxpS)ndyyCFDrbE^kk$_2g!<@Y3rM%;#tn)?Qvn3zc qme2f_4gShkRV&}rZuxF!YBxgk@wy|sQY46QEL2Lp6Ix7BB=R5T3_(Qjarp78$xojG$GEL`VoBjG|Q_wGt-#J&nhlaehii%lg#I#gx@ILoe*sk(J}RRMfB$=V1+aqa2ky_A*w(Sbv5P&1eU2J77!DbZMt4sd z9jo=JPm-#ds~IN(HXH#LZMB(eR$ZJ5bSB1wL&)247)k*jj=Ik+w7Uoh1zSe88!&_d z5n{ruF9))brC!jmyr}Csme)@Sv@FoW8ABq_M=FqEAaITg!c5{yyJN++OuabTlA+sY z7z$kCiqKM$n##(*QGHDH=cU3Usc-hH@gMc24~bM#ye;b}8XRTAz`RjH%P6Z7&nC$Y UU#pl{goag^z_dQzH*o;%AE|0aod5s; diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$ReachRadiiPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$ReachRadiiPrompt.class index f3a042cf2301c6d72e7f544e583ddc0e1079d80b..4291229d2910827a0ab2d6ad9e80d9d981cc712e 100644 GIT binary patch delta 456 zcmW-e%}W$v0EeG7RU{NVZ5vwGP6_5bTPV1SP;d*Vc7Gs!KR z4rU~Ak;En>Ez+7npw{}+Z&cxvxNo)! zz3PGHA@iCA9+}^TaQ_02HBWe&2{em56Lgu;eAkq~s(E3}uV-4#bCv`Lro5)-HqxN( zR)cWbzfld6R3IG93zj7-nwPxNyx#G@VP4Q3Bu*Hm&P42csUJJ(q!&7~ejN2_TD+AQ zLB)*AlV($N+L~3~Y2Nd}I94gY#=5y;9kMpq6b$ZCYu1mWM{fG=^}1J^Zu&v!&NTca zP2BTQJ&MP&XYCdFS(t0GzkO~`hsdep=CWPQsZx909u^ffKvA8dQ=O(qo#Cu1Go%I? zQ57OJ#GD#tQC(t5jj*gP@I_tZd&d1#RsO20?QU)DD*N`94~CS;F`7kTUolG&a);bD DD*bI} delta 418 zcmW;IO-NKx9ES1d+!^i}{~oazMKc$-MT?M7S{cR!QoC{CqQxvCF4JY4lruSVwbV@Q z!!j$Ij(xdr*G2|65`n8AXw#~Qf}(_=4 zxb<{*^Q_?_bB1{q-0QT>&U49dnJWokxXPlU(+#CMOA5aj+F~@8u!d_~SG1i8C&S)} zxIEUIFWb@RbiQ1R6)G?+aYM6gxXCTU?SK9XbBaCXT3{=2P^v~@994sOB(%YFRIThY z+@Y?>IjeFlhPyb!D)$swx8-HsVZS|fp9gN(??^r5ksI}YyMs-AjRpNgHBL6QDo4Za{JU&EAH01JoaN<~8ShLD6U-Qn zGONh~s)mF-;DTX{InBHwWK?tY^=@xNN2*!W)HIPM*7W&^X32eP_^OuOyT+5HYr=I_ zgjH_1?~RvRR=FwM;*z^3ri5gb*!A=_H-$AfS{BUfNi>Nt2t_wwm}% z8|x$S7#~HX4x|cFEun)t5IZV3@dr2&1b=`(K)ju8*n6$P{+s@hHsAk!`3juoRmV)7 z^bOOL42LOeX5&;01*&n*8YT%eHG{)N&HUEdslKGIxvp8zxEfEB4H3l}xEsR4J?`7_1A~_qgeJ?1qgUNIH&Y9W*E0E{KjU4= z7ps9nIl>Ap%>!YThr*+M<74WIQ1x+gmf|Rqi!$dBYJ| zCoOL|BkwpT8;r?&O7ejv`AAc?Xvrq4@`-Kv%x<{blWqRUPA@Hb-*=)vd#u0^5hlW4 MNyNi93(OJu51pA}q5uE@ diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$ShearColorsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$ShearColorsPrompt.class index b10bd185ef99e3cba65b3c8cc3baa95c1f4a1891..415a631727ef782436f132883f6293098848be27 100644 GIT binary patch delta 409 zcmW-dO-oc^0EM4-X1wq9&e4jdDI}Yn&_a+X5Znk6L<=|3rd?uTAQ{@)FlaY5>T5aW zXjy*rr8(Uib*$-IDujq4iasC+cY%MP=;G?Y!{Iq_Dw$uI;N8D+1=vG*Feo%+x!`j# z;4HanPB7pzm?XoH#aV^}nrOFNF0R(bw?<&ZlDG6*&RY&zuDCz(Z|16do7kBg6$Qq` zIM>{IVtdUv*Tn=k#7)Lrs%kPm8Rc@-VQ)lCG3`=bgO?XG+;Xj6{l44WvD_8+m=$x} z7xNS?4@AgAL$bH?__3b--Cf;1z2Xriu@L!k-mdr}OX0lNY)rkIFsbT|&XF@GyTY`e zh?&L+Ho6_bUsDXzNgF#*BCQ3Qw8$YX(V;SZS|+c@(bf}IRbfp}4SHtk^xW*#3)7~T zrc^1KCnd}snaK#^_fot?!KL2Qv|$)o+)p{b`Es W)TWkgSz3s3lq_uaqkFSlBK99WwRQsl delta 421 zcmWlV%S%*o07lPmX1w=$=hKR;NQ${_gcgECi$X#nf@t9;2nl+O&fI2dY{CiYLD|by z&*@icd95tVURKVOMS=Uo{~!q3v?`BO%v4ZluXjb-C$ceLCoKxjnbkoLm`$QI|27^DZMUJ6*=@kK`9~$9_(&OWzd} zL}HSA_GfBM(!lZE@P1G4X^M+wH91^OR>U&&3N~ zidkNX*SryP)C}oLA)g)GUM`gfE27R@@s7x_wpa;{mX8P7U?^KE=7QYGe9-^j+92k6 zZ|Jg9rpx|vew+6AwbvWHRKjla|CrwT*0h`0v5(c-Plpb$O9#m*%USg?u6}CDv7|iT z6&iHNw5nh>t7v+3*c5ccTu{kG8Zh%J*GHOCX5$c^POw6!Xw_-9=nUN&rbp*Eri)DI i5;HNM)n!|2{%U${by?@CkWLcpjk~kli&KZ(BJmG{$8VSb diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$ShearListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$ShearListPrompt.class index 22a3ea127d7cb8e89e940e130cad76ff04c5f9b9..dc450c6886128071c03759cdcbf1c99150b0f31a 100644 GIT binary patch delta 804 zcmW-fSx8h-7{~wT+RQz3=R*pYhbSGM4QK0-XY9IL>mM5R=+oK_AzpX%95EyX+{HZ^J%kb5Cye5O zKAA;dVHUzeU5PQ;ydL4P)@|GnIYxMjal$ik==4Op(~{v-9TwH2P)?c6m6I6v6o&u%fO&V`J)%U43j(8nA}|cNpd=C!2rLwhZ9@!;k&rMHL1q9uDvGEm z!c$Qc8(6R+gQ%d`8(6@O4UKWDv9VFXcfE`6&&m06&$-F1kNO&^^^SD)0GNi4by`S8 z0-PE+TpXn`%OuJ*Bw#7WG7ZbI!fX^PIabMBEm0w{hGVVFbsUu(>p3=XRB4F8Mu9j~ z3v9w>i7gy8(%Z_hjiZ)hJ4c=L>Q(3(DirKcu~S0?8sxOy(%r++D6kj%R5VF-zlsBz zv2X*&At@bJ(JZI5s5l~5Jt}cb;q|tm{>d~|JR&?sKViUV2dKg3CxoYX#*p;i zC{$|$pW_9Ccb>h>ZYy;;3Tzn;r;G3suNbU`Wc4Ks;x*w7-V)y7Js}N4dM0moN1A;U z&kqdQdhD1Ocd_`UXyQA(#7|5V!|r_VVI@WUhQIiOIPn(+VgyxURK6C!$b&_aC!0Yg zR!$mgAi?^{TQSjCC5(KOc@&^j(*&i50^Q9%jY?Js%oGZL3PUhWMlwx77KOt>5h$Z5 zRFD--6pe1OVUS|*nPTyU;+QwZvv^8mi8P&MQWC4AWL8BftcFrqE2Xg?l+H$Jrrzk= g$>!*D{qooXgCY8mpJn_mD8?5`z(FG)8i{fIAF8Ilga7~l diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$TameAmountsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$TameAmountsPrompt.class index 75afa5947babe6c3919c79608e2533696481cc1a..4254f39e4c575182425190ecd804cca167636dd9 100644 GIT binary patch delta 364 zcmW;IziSg=9LMqZU3>RjpL|17uo+?#GAShmLoE0sQZ>e{3L=@MLr@{Pt4Z3bv6^bF z)>du$SbszZ{{le{K^zL11a~I|H~#_$mx|Z!pVw!2e^38S>u>+Q>;OgH_4L(=Ky!^b zO@bSWrbkQT)ApFxTwy`6sL4@P-1^v`97+X>+lr22R#8)wBBHoseh&Sxmdxkj@z`DA z9$jIX`{vj1<>WFCgcTk}PFUrUDLaSUj_{Z@<2#wLC#)+rgr__cp6|&`y5_x;b$e_n zj2So;?*-e!OJ13{n@_#wjYX_I+o+vw1oM8oCG>e~F1mlLjJf0<7&#ZzgJ!jTy&le~ z50)vbLYN&%ShgHANA!#>xo}CBt!X)oClicHp0rGITne0)BIo5OflSenW30+4*5m~1 na*|I{Vi4`V${Bu3CESg<`4odZRvZ;d5)nS+MyBC$!KsOOeQ2WC1Jw>h(jmB(BRS*rR7s-0R?LL z^oU}o{sAtgAu$dnx-?-RL}QGUC}JW5s{<49#r^)>!*vn+8q@oi?>_)tRJZl$?X2bj zIZYd5iibfSX;O>_$!mrwC?+&6S zhIxvH5)1Zc%TTDqqG5?Ao-;gU+4cr*x-*6qR&6%W9x3xoQ8BEsZrHezn-py=aKqhV z+aY0dPC^@=V+}9Zu_3o3`jS@;k{`*WlbKv0n;$pq^4bo#e{Hz6vz}IOoO-gg&GE@6 zJE;48(x}&TuhSz31m%#hd?qGexGUdC$anhWh@3Q;l^-n2Z_08)MSig-r+oBw4LReF doY&*V{eOAuT6ZKx2R`n3sR#wVKq)5i{R5y9T9yC+ diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$TameListPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$TameListPrompt.class index 6125d9770caca28d6e2de10c53954f964ba29a9a..f2c935a2502e20444d173b8bae8449aa2a3b63bd 100644 GIT binary patch delta 813 zcmW-fSx8h-7{~wTigVB0?;wR*5G|9|OEQcInL!{G5k$VE1%W+`HQCgt<&2t3PGy;u zns!S~({j(;o199`(zL}EEp6Y6o`PN?e9P|XJpBHL@B5!`fioR36QPa&?H>XVh41BB zxYrGj296AlOsQEC2Q|bXnp zI7v8#(-OrTCDK>QafYLeqnzWc^ywCV*Tbs0|AE=Rh+2KZE5 z7wCgu;0A6o1X(Q!_7sODE-lGzv1&4UOQ0VE0)x2CVD=cve$(0>~wns-r^mD z)i7B@1m5F=z(;%%_>3=d+pl^o?_!ILbclIS^_;|KNN7xl3q z^0QTRldYx!ww(r90S&Q28fL{b!rEw*{iZQCOXGTCh@Va9`Jv%@bm&GlW!%;WS3)s9 NSPbe7oiG%0_&;t0+OYrt delta 780 zcmW-fX;6((9LAsX=JuZZ{!dLI(O7Pqp){qTGGiGTW29(OnM_Sn%{5(>H1~FsrHe?& zk{1yndzQpasAS)=6tZOZ!B-y`)3>4;69Hmm75@j0Vu!^Hx!)mNC8;i9Z>!emlxFptdY>>K>*JMk%>jt$lSu5 zyaK1ywnDG);(9R)a3`@I##-ECJWR@v%MAYdBD4Qefw{OM;6|&!RkSg9M_5vGimaBT z;#|8WLX*4K1g_(TKs!1Z%nsu;wS1-3uA)=mCb|S}p_Ksww`G+(5_i$6*P8-8?it!; z${c$i4^*@WJj5e`$9Q6-wHPD9BG7GE;yjmmJjFA;(KDT12=t&=;H9yzs6pme0 zFkLTEqxEdHYSbINHF7S`appvpI&6iJi8i}K;2qxUgKG59etZ!4h))8a@kL(ms~*pr z-9Bbt#q^CKZ-QRp<@f(V(&(3B9tjf#Adp78lf4I&*?|~AL5QJX6jBJPC={JE9)D;e z3#TxaK$BP*MX@@X%z9~x;z?7LP>NMjXogZvGnFoicUSw?D_QelrUawZ0*s?X%%UV@ z(L&fL8BR)pix#7SQqe(a=%;l2pe6W8narEASS)3;X_U({D34W=l~qwbt05a}q5}4t o3fW&O(Otvam{V``3)VCI=CRerY|gO#P>lZ*hhv65HxxenA31TnTL1t6 diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$TameTypesPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$TameTypesPrompt.class index 30bb3a816d1fbafdd715f99354de68a3f8cabc7b..c0c44b16f6063cfbc0b0da4c953c52f9eac49e00 100644 GIT binary patch delta 505 zcmXxh%}Z2a7{=lIdCz#>Gv|3|Mw)~q;{;+*j6_5T83hr7phVaoU}O|bji?LV6trj= z)Vrvtpv`1imgCe^lTG$rHmQ~1LeoC2v}`K-grwu5?ZwT#`5h=tmb!hjnJj>n7&_?o zmL+h?LA#5?I2}Y2&N%2`EXP@ma~hp4DzRJRLNYJbd>^_rk{U-fPH5C=bem9Mgi>ZI zuxRN;!6l>xmvM#QM!lN&)@Cp2xpQ(=kij)U57Mdff-17EBW+skO?HXuXViZFu1@j~mEoUih<~YR{)3Hv7!MX;dP2XK3BeHy zg;IcGu~8uo){Bc;VKmA-9Fq{*eeaYaGaeqJVUsOfvmk*gC~QXp2s?hh1kOYK13BZ7 A@c;k- delta 473 zcmWmB%S%*Y9LDkQ`<`juGw1h$4OxOvoWO*Ni3ka!pf(`{N`(J_k6Dl5Wo8!bf}%}}7ST3>=(PPTp2hRc)pXW)vwzD|zy>~cc{8;s zZoAy^=wT>EieZ<#!dgZQ_Y9*RTR332pZjHlQUA=P||LaCB!hYnfy!n2*-R#w^p! zC@O;%r*e}*`IaX=V;I;9dp(j*Gg?nWJ~l0Pb4SZTL9M~|~iPOx51vO_x9Bd18qX?o=hc{$6Roa4Kk zSI7lbEuE@PE~+NEr1nXdIwsv}Kmt{g%W6Tcs2_4wN2EuukX~IceR`K%)BB}gcgTRg zDTBH!*Yzj4p?}IPwui_2I1qfT_`ODkab<+Kj8ZKb>LtrI$E Zzo>NZExvhaiUu@$!&WSI!#pW6=znLNfJ^`Y diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$UseBlockAmountsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$UseBlockAmountsPrompt.class index f5bb9815eaa459ea9d70874af8481a5dfce25567..de1e7a4d6553d111ebb03eabd848e77b1dc7cf2f 100644 GIT binary patch delta 380 zcmXYtODlv?0EVA4&Nwq)hm`Ax(rl$?n2x4W?d| znRAh6KD{jkd+ZCGc(l7d9ErQJsOEq}LES&(HxucPqS&S!e?ue`8EA|3hHhLH@R&MP zZj$~tkudE}vq;`tI<=y54ZqwVOKuX7DJtX+RdSamxlc?UFfGqW$YbW^3Agf;C(FFZ e3%=x)Db^oW^`onE!<6Eo(f&!6&%PLD5YI2^OJDy0 delta 366 zcmWlVJ4<6h0ENGalT30MMG(=5g{Bfj1d9a~)<>z>D5MlF8iNwAn%wwYV|;6TJ8?I= zgHR6x2+(vu>cn?Sy5s5UdZKY79kl9xT?L@l)VrGl`zbsjTN`G`}bby3IxKo5_bBM2k%= z*RF~N%w^?Qe0i1pWc07F}Wh diff --git a/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$UseBlockIdsPrompt.class b/build/classes/me/blackvein/quests/prompts/CreateStagePrompt$UseBlockIdsPrompt.class index 22db58740287545266bfaf0027dfdb1ee5643913..408a526f0c3b6b1b49f7d54551b5099d2386ad61 100644 GIT binary patch delta 445 zcmWlWOKTHR0ENFhy~&+SuTrrtln4PAf=~-xxKVK-E`$a|DI!?ykOZA{nhEoWT5GGe zY3sZ3`iNTJTGu7J;tQAVx+`>5e?eESL>$+L@9=TXbbcxC{QSG}6&PTtlhZ@5p&10Tup3>Glqn%1$@@SiD^f?Di)wWv@|>b_TUW3!OS=$D#T zyjHvs95Ex=16z-mqZ45;R*yArX_{Y|>b7^hPZg7>l4hC@d^E$^KVo-lvp07%@PlwD zwd>5OvzF*hIVY=3$Wi8H zz_P6KMK<^@BYw!3-!c)FbcHR)#a=mSR`o_&+u3q(N63CGis=#b*y;Qs*RcKps_k^@ delta 419 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 XX8>p8`v|}~z#{?Y0RI$VJ&FGZbh1I5 literal 21449 zcmc&+34B!5)j#KECUY~HY?Fjt9TYWe#;}QkC_9mWKmrMI*J{P3oAvA0#je!y{qKG2yqST*wj@0Gk+@_mx;m;8X_?@4}8^7kb_B>7>F&EBOn_ z|0DT#lK)ro?Hr8r26QBoW%#UWB0Dn$*<5~HOUBgI%L#z`?= zio>L+mEv$I>ZF(;#Y8D4NikW9DN-CE#Z)Pdl;S8Urb#hfile2NA;mFL94p04DP~DA zTZ%bS%#~tZK+F%)onk>yghag*$4RkJiUuhbNwFB#h~uSLBE?cEmPyg56ls!TxfCnZ z?FmwxC`EIS{9PqyQ+OENbidlDbfMa9i$J{?S_CjBS^ay^~@lBqTt3LeJ0K-5?|w=;v&vg z#+|JmUsR9hsJjo;-MNZzuDUxhWTAHyRgyOWj?faF?pb zHv;180dW}WH+vjMY~MRj8*}0CB$p|>|}egD`j;q(>O<=fVc_`o1z^tPyef#$`rb3 zV`t3nU8*qd&fjDzUlxnDu3Zd**(@Ngv9QacZSlCJ(X~vKx@|+UHJXkmZJWystnH+L zxDL)Kw8Yf4%S zzYV<*i};3EmlY%1=$jA-i-z7d{${3X3-8h77N~8J>f3BD+iV<-0^(LEH8;_^HkwF# zxZDQ8CZ#?d>#zmi?%*?Qtu`BXAd4IcaFtGJWM8by%9h}~cxtU>{2ef4c6WMKd$M(% zM}_ae5R2qC#KJjZ0^+-1vpf~c#pX`1u}E$<7S7FP6Vu=&?a|hpjP63JIYbw$DhKOk zb~n?IInfRbxm;@91J}E#E_T%}w42|(P;ORNEV?ciyUkF}A-cF#Iar4olT4+d*y8RE zCa!1lb#}#8BeV^tM>j-k+oOp!wT4ART|0YiG_6Yw=!Nx7GaKq>qv6b@%V$EZIWw0nG;V#f8kWxmVZP?z zTT;JxA=)olzHCVY(Ej<$=FVNrRHQnX_XW%5LRLUw^j%@|+=hnZPf$FT&1^QA8@K*t za~tP2f#39aBA%YXw6LbWe|rYxsL?ARaCWjShO*cYPpELT#JZZIE$zUBRiSEM5$%er zXA|j5uZ<%PwK)~&)H6q_b~chE9cxqpHij9zC)Ojp1&AC|$(op1=$m3^;(1n$+vTmv z1PW0~*HW-@J>fo$4%0^GN)nEPeY_324Km2x>3DlBj9M3KQ+Wp!{Lv0fa$pPq&WD7tMsD{o6Yt)!e5wli3 zPoY&h-T|NTaiGFNWe3w?`Pr?w=zd61cVsY^nb8@W)AZ>%44nZ}$MoCU9D=HG3BuXB zZc(&Ti^7T?Yh)~!0^&Z@k!WjctTVkL+8%F1;M?jGo!v06HP5)Z)HDT;?%P3jV)^5S zw4hQVl^Qkm@WYvA*W{U?Ide*!30B1>-?}=*ctYNcQQT}66BLWayjkS5#Z$d(855O^ z75U2;SYegZTieYtR8XVJN3b#3-PIbK7gr@?P}aylOx5!cFXt5@K7mgR@lswE;zn-5 z%&|K7^ zy{JP6QKx!LP(3Eph4^%FKjtv6+*#f6_O@6T$c!o9pHg)zBpwjoQ_fQaq)!J`){IQJOHM6}9O_ z1@u>LjUbZaBgT@!Qac-kZY4%HQyqArQ!R81E)&58X6bc|!^DFDkC5(TvncFNnG7a@ zLCN?C)>KaSjAwKXqP5etwL5Ldo@{i*sxG6e^Q^j}wcS-rF?&SQt!pD{F^OlcLFz<| znMJ551)(Yyooe|BHywc{Fh@NpD?vyBBO^v5I5K3;J9<%z4pTvfU(Ho*M6ZE!pp+o9 zr?#fle6W=*jGPfquZ@Jn(_&{pJQET>6uScAN64u*bIEUb;YfqIxo~&O%RoV1$m*!x z2Vj-;Xp8hk(#c3bJR1_viRT02$06~8crhSe3W=A+Lrg- z>V4Lkz$@I(`kf4;#EsMMZYqAtx$y+p7e`vK0$7)dBv)gstk%Oif}AMDP;Xu9;$2Xu zhD>;TWSJsFY)Vcf6b)xEFqO$fn%YzvL)+kMD^`?7J+d961{yq}-gqO9W9&!BD^~4o z&lIQBTe$JIt)ijES?TzQe&1HtSZ5XjJVLsc%_L++Ri(e;qK2Fm4>O?dM{p=d7qh>y zD}m7!Q#%BzyBdEIV?#aT){hK~VwGP|r$!kF$k^yc+?G0pts$9M6B0iWuY|;_;x*OQ z9AHLUb87;9%1~+}nxR#0RleJs7Z~UVhD4+IsbZnVOobAsH#;JYtzGd>rO=QX3ze1N zfi|OYh}%?(6ihJF8){(x#F#9CA#O2C?>`^=YHH#qu|yL+DEb-8u-KPEr%@Sw^z zH-{thjn?K1c5(KlQ`W28D7B%n0k*X?@ZAn$kfHsBF{mjSr{v!f0Ki%0v;XmECh-}#NhK>eN>a@@U+-qnA$AzU0j-r5RW_ZjEJQO-XN`r1W_!wYLG#$l?%&qeAEvLs?)6-lUn;5m5o?)DYcQrLsb+j+VQCfzmLvo06TV?Wu z1t}b{@^ zgA+z|&|HHQ%Gnd!S+%Z~5I<@l?Xdj=5wkYdBk@P7@a(G-n2y*N-C(9xO!~MovBnH4 za^N_F)}#+9t80$S?Rzaf+P%6h*3lJBwAGq>S+(YS66BZ1)^|tSQ}t^S$*$P!XbO_5 z-5F_x7OyG!pQK@Y;7Bo7)H?e-c+Ri+sJdzTObb4rm+U%WZ4zH6sF3zs!*D>ZLOPIk zx;`Y@mPOAnmtB3h2-Y5)+uDqiKc#P#ORoLJ0%EMbE?8xJp%7}QpTD4KmGwzNu_jqh zLH%TYnV>&wSfxKoFc_$>5NIU5NPF;wXBCCj5gzWs>J(2y9PVj|^F6>J>P$;RyuWIQ zvoQ^EfTST#o;1W;t%f*C(-0?Q8e;QPL%iW?h@Dam@t&(8HrF-8(U^vK>(vk^Xn>Mf z?K0uojt|~^4n_l+s9evwTRW?wka*z6C>#^%CsQDbu;9Bgcs;o`>T^1^Tk z*Fd-gR~atFwJ2PMYcO1nYjL;&*HAc&Ye~2g*V1qmu4UnBT+73QaIFXr#x)!sf@@`X zD6UoEVU62p_?Y2as9?+v8qvIs_6zU7l@1ubl_Fbdi%(yKi9)+%gJ8&IF zg}Bzy1vG&!rHOPqO`=USnKsiAoB(BvVHYR46Hl;E#|0nx;ch)5A@p4rVp9NLq&RJO zBytw|6%h>`H`cAon8&EVP^X6u+)4+Tv>qC@l@1Oc0&RQfP~46U*KDQHJISvxnm9(^ zjs?+VVs;t_Jj`2U$pO^|RCv6B2bu$%rdA0@Y`(7+~v198j+XZ zvUtojmFrurTz;EpD-G&@$8Ym(75dA!1=>w6ztw9*UVh8sahxGOYZy3c4espdc^KDBF4>bIm;a zlF+P$smTx%z`@~_j_i|gn`_29*}xB=a-X7^xhy-?;qJ_MS(Z5h`n7Cd54g*l`I~uhWM;pcht(2>ut8uI@i5v63Za_3#JrS7aCLj*%{jD zbaSS9%;SZ*=la#!Qk^hn6aVA1Mk6&3*IK}@8)U2n3b7Wr0Ba}l7_EJb;?ME5UWHG$ z74C1~tkXhW>DBIN;RIoQhMC@>k;S9K5T6xfaR9q69X->8}t~%m&mX_sm zc-k;=kvq0k-q?2Ae&{c@8?+U!*q)&gTB;pe`Z7aZZ)~%8oN4OVw^}N;1yg+0K4XY1 z$>8saj?2A1d#Lo`ULV~1{r=qR)>q4N*=)JjtNO+Pd-N=?N57WCqk=Ll_Ifmn$Ju>& z)KM$fXgSALI_GFP*CsztYh3RpCuZp8iiS~)jCYehi%}mhCiiUSkk_e>0!lx>mwcYB zpCT7}$>(Q~0|irLwKUS{uD%Q~Uaq9hqJ0>k8em+T1N{QXG2SGH7FK7HF4UxpRCx$! zlJSZgz8H8E3{wyu!q!xHG5$*H-j!ZcEDwXe(5B%n8wPzu{w73AVNobVuds9#U1< zD!xchU^LNox~jStd!2rztzdse@+!^J<@Bo^8BURWGs7&e)3bPd(-5EKbVsdRPQS)h zT07k}YL{n-*Y-Qh3~NWh&&+D;kZQ=cS>^kirm&dNx2(8sXJ(k7e219(7 z#~ihCdF)18>Hi0hxo739-JoyTn)K(sZ)3ZtpQBbT z_uXPE?RDR}4Dp_Xb4}XFIdd;7W70OqX#Z(=U4Qer+fuED%UgZT=eOEs^%slVwCi25 zxLqSMV?kXR&hW-!Up$&MJ5}Gj!_CprsfJcb^R~TX!1jE{YtMIc*>g_c0(R1!TWQm* zeHy$kA&$W#AE&z<;rW}UW8hjh-|aF@)9!J&--}yg=l4UeX`2nw0A^pefUyWl*d@Rz zYnd;6-dxxh563m(`=C_ciYnQvg=eC(%g_DZtoFL<0o~ciYEAo|!|g%b8m@Z7tHJjT zQVv(`OMrHjOMv65eGePAl3pH;tNPZ_88$OblQNR_A>~C^`aG;%;2P-Tno1wm(Ma`0uCl{2$Q;{;%l5!Vz?FVGUhU zcoyLKba~Y;7j38ei{7ROg2U*+;1YT$n4pJ)SJ5NE2dO9cIQ16Kpq}D6 zw6%CXZ7;rzeo%ZPJyqO8PZ$4%o(YYkU7_RX+0Y7lE_6HKUGzfeUV1t7D|)rWN3WGE zpw~;zr8i4%qqjAlkF^ikO`mF32`m}5= z{kE)yz9_qwepmJZ{l4rU^oR1H^vCk4^kw-R`g8eXfKSjr%ip1|Du&bEilxjINfs4X zv#;V7_E-E8@Cy!wi?}4bh|9tkaYgt}4u^MgRrqDDt{lQumHYFs%CS76aslsGc_klE z`9mIAxtkBH+{>e?iuvHG4!{)GRBhm~RonQmsyDf|dI;B5f1M{)-_4V&f6Ye>D&nbw zT6o%^^LYB8U3~PQ-8^IPC_Z-Z?L24j13Y)|?|8wGVy+)@JTDyb6fYU_B`+O12B)ex z-NWJCL_UV1+>NtVKQikg-oR&20rIPj&%~WioMBOsS0)wNWl{?swy4M|lZxCjslH!X zROFONMP`}Q!UHTSGRmYPuPo|bI*B*(SyX@=GVhAU(1lvlLgdgc{+iMhnRGXwtu#eG zU7~gN2Op*zjdsYPxA`2^4w1}kszLUs~ z&-q+%@gqlG;`4Akanw@;1q9S+h)O~%( zpbK?hf5o-1P5ZtgN#__`Dz1hG7omqQyvw47?*#Q?#U;GcqE-p)AnCr9yXksE`^vqP zHu?@Kf<>3`r8t$v8LV}Bi@UG$WyG|0$dC9NI9C^ZIZm&q(g9}dudri(1!8YR95^%L zz?pFd&Wtl~W^{owqYIoFQ{c>)0%u0;N;_)6nNhof{AR4s!;BTEW~@LpBLu1$jVtYF zTwzD!N;?{mVMYU7%oqS?#sD}o2H;|P9#qrwpql;$&h$5MrkA0C>1E*fDtPZ2n($`) z-Hux6aU7mI-1JUU!#$MH&e^E1hL@J;`vl^09ba#Jhu|BBFEcO(#AoBegd)Ru))m`TD`1Q_{qP;vD{Mn6{XdykWpb_UQ?K#0u#0{uPe+O zz*Jh8Hx=eBV5&66YwFvI{La6nShZ#d>)zGYy$2bCEY$lN^)sLbYt+f!C7=84XL7cq zKj_ENJLp3#;pdPrL`!g7j+Jx{jvw{Qaku99F*pvj%=kp3J_Tx+MwRWL&s5OGHu}XQ zxe@?t#sd9S&*yX$D$`0T;*;fqJ1f!EOayq3Pfak`FAr(5xb(|!2D=~1i}Ugacx%IoP1?xMfrOP>PFJ|nSSn2b4Z z2IlJdd=@XktlW%wwgvOiI?S1A%y{QuuDcX-+x3_SZ^JD11m>kzFb}=Mm+{A#g+9lu z`6XY$U-6Y<7+)o(^3|e&uMsQwTCs|+6YYFG{*ka7#2x%C{3{^e7LW2xVh7)hzg&I` z{)+8w`YWY~F~+TVPJCw0a~Su0gP!M5sVPFk!WH-v4p;17cR-!G-M=mz-a{u8?VQ-vBiM2ig>4fxyY<0y2#iEqx)88hWTI^V*# z=IAU2CiynLJx6CAKxdMC2Y<)xjPJvsD^awEe%VX4J@l(y`gITerk4)wq0f8i*dF?A zFCEoGU-Z)d^w95mX;csWZ!eAQq2Kq?qdoM8UixDX{i&B8>Y*=t>CZj%mtMN4hyL12 z6MN`yz4Z4U`bRI-sSnUtr|K*!$Nm2J4DA34Aw*$(1UQ5a1m++bh5yFT!E`tsLR08a zyb#sUEE-J1?f-%0-h+f6iy{)rC>5fMyHFTx_h3@EVPeH*X< z@Do5E;BG)a;D>;PfbRna0N(|a=!bvZj)Q>3fFa=D1T4XGDPS33Iba3wuLFkhTnShO zSPeJ`a4_Hy&|d=_isxZ~!vRMC?gzL(-~oUUz>$Cl0v?3+uKQay;12;j6tD(x zG~gJ(v4GoQuQY}^h diff --git a/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$FailMessagePrompt.class b/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$FailMessagePrompt.class index 271097e31bf2201c80194bf7242fb6fbbb6d9a3d..1e5af3a180a1b42f06ac8b078ff1b79da539e876 100644 GIT binary patch delta 262 zcmWm3%Sr-K0LJnE8As2|=}1XJ5VYtCBBz_((=L`{7t7LW;UF5qkdVDYn-;;@^#H9} z6zziA7qlwc_89FVXY>1i@ZF|fQuX)0=T{)ZsbY|Ew?{^i#*<7aY&@4qrlK|NFcUQ! zG3zj=m}kLZQL)6bWW}YQTtr^=Se2|v)*tIdOKg~X>qivKb!<2(+0<-N)cBOlLo7Gu zv#r@-SCD7~=Z$74+0&HS7xcA)c35h5yTMsga-gYjXhv->c|=uH<5)Aqi3#jGF=B2K sX*b^qI~SG9cK8&JXDmy+nXL3J@nNoHONmch@x_4nHovkKon@!+555jGL;wH) delta 253 zcmWm4OHKko6ouix3beY*N)$CQVF?b1Hoiqgd?61}@zsO@9nugJbVAsL6H{^G5{whW z%tRO9Cftd!Yx13&bM9B>HPiX|`}_t1TADeQ{e(a>PhPR2Nt5@PX4PG59_ubQ9Gf0n znr#XmJDOeg6h-&B?8%JLGA9?aEU;qFB diff --git a/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$ItemListPrompt.class b/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$ItemListPrompt.class index 8e58ab2631594da74fc0407aaff480abed752fb3..3b9b4eafe98464f1ca614a0d1db80fac7c702873 100644 GIT binary patch literal 5762 zcmb_g33wFM9sj+}CNo(E3@b!VT_8%x!9t)G34|OFNE<-1BpC3TWXEJ+vlDh^30SSw zT3c%m?M-W2dsuo}OfeCnmSV+Ld)WK1+S>cBwWpOHzc;g+%q9zx&*uB~z5l%TzpwXR z9{bO+hXB;z`C?px{R$4KxK_ohR9vUx`Vd<1Y85wx@EY8x;-(OBUaR6}1+SZeI@}`H zU$5W|A(Y@&IozV)jUk+iTZ?fU-Xx(nt9Xl?-ztaOd_oSN zRPd<~R^Zc8zt2d7dsKXO3J&951%s0Ca|(`xP>UfI!wT+~;*KgfR*ZU#$l-wyhX++W zq~h}`j;r{BiW3SR7ASIhO}lKFz_QjpBifbFyZ7uf%w%+L+OQov+Mlxe`Z>25d(&ph z=rfXzeW|-vOWHMN(sb$sR+LYccu9vqu*r%W0_U`vNn=a8uggen*Siv23Ab9^dZI&5 znescc7?g?%OlxtBzE;zAJS_yYmSoaMH6?W0Hn_iTlA4s|@}pH#dyEY8?Z$pbps~Ew zO7%p$(tGxpPPE%f?lV%h?wD56jyCze2s(i;xvJ!@#mPq{;$I{UTo6M8?je3;Xzv+FF_$z61T)5Z3q_LzMN+S&>e4-LqNmcTNc89*(c7M*p-$_G7Yc5D_Lk`EWF&LNN|MoPigG<+RTX!r)c$<9z6k*Y=fmPV>Wa`#&rzK!o_ z_%5ChfQIi$qVLP$2XaM=R7V=(@rX%s;{Q;tmDO-DW;hXca>mNtvm@nOtPEru&XN$# zB~}xAM2fINcs-L=!;|qo;=cv{1c@e}s{2>+@h3ZBvMQ~ZoBCBZb0x73lmag!$HJG3L+GN49$DI?@hOWV=#XFSIvU~=kc_zV83 z;cxi66!{OH2-|y&h`>KRjj$4R#MamQ4AsJiVFsjjGe~ZJKzD(@pGYF~hcb(684WUErc} zAK$HAyN&ML!#=ab*3K*vn3)fKC;2krbNDXKgP2DWEhs3L_on&zBGqIitW-Pi6mq=wab1W&xZWEv9*bMQ0A{h9Dp$I3R|8RZiZ$uZd2 z+P*3-zO z9gWa}d@ghwwJaRZjU|l#deiPt=m)Y^tjsyp@^t_Fm%m`cw)O^=hGVr_1H7y1HV>~7 z7N?%DTY8dK%J7zQGA8R^+ESJyHn$|aQmB=A5u(D)R%%DD)hAF+hx_86OO(xb-mdAo zg0>Azm$I|LcC$AbZ_@`hvoiD^+L2f34h8=dFed#hnC#_!xodb(HV(Hsc&{q*UM>Rj z@-o}zzH4N{T%&i(d$hp9(<3%}I7DyAZ%c;Vi*t|xT9z;C`cM19DqD^S-*zp0&x(=~ zd8Z*%2qBLTj$8P(o!#o2 zaT*FFLllZI7KjqnZdVQAoI{9=prmsc(|s622upIgPj`8hQCoC0z5@oIn&XZt)3(hAvi1X#b1sU=js)*cKkZ)%^zrykS7M=}N z(Rivw8LC6#e%Db)QO1~6AH{_N2eFF4MFRBN>fl5@7n62&@P3qY4ll_v`tKt-nB(<6 ztsg4G6%5d$SaU}5AjJ&A=f=vcT--J}LK!9*K4~`1^qbv~HGApl%pOFPk(y0ymJMM! zIr;2=;Ea0wpW{|_n3WK8D<*|`EQ&cO7IP66^Ds-yN4Yp3QE>rkL@?5f!z3dh8S{#m!=sIL5Ds#Ts!+tP9kL`oK2P7`Rz% z3LFzHfoH{Lw<<43F=pXB?7(HL-PM>$s1pIP6N|AEyATx3{728_xB>-%ZCHjYaTS7r zwb?a z*1mv&Q>b_0<`=Ms4%*GpZAO6={9>yR?NzcSYYsvi!HUj`VXQn{6=p!W(v&UfYG&8V zGT|J=#j-eG?xoF9tO{TRmvmMfff&Z>!y~A5VScP3BZirbYIEq_vR~_?rx>rhRCwKG zj9XQhl}ZNpdYYWXObZaRuVyO57x_!mZ+J+%9z7DY|gC=)par7sthJoDc~-F8c7a zu<(r7%Lh~n{}zteDAFP(_Pg1)2?`#h%mn&4KFME_P!K0@M`rCAq%vy^dN$Jtd6_2H zEH~3+HkBe2uGL;Z{i0J4V(uxX@!aQm&IIHOo1;9<>Nv~OEHoMtX|;E16*0*mu6H$) zSxc;}L_(g#l#6Y1m#;>S<9Nz0$ViUodE;5|Oq1I_m-_%>oafLRm!KYPT(9MPALl=D HMv3}Auz*w0 literal 6094 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 A#sB~S diff --git a/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$MoneyPrompt.class b/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$MoneyPrompt.class index 47d8adcecdc9431d632f97c3bbb3f03c5ad44628..8ce5e1b7fab6372cefbf57c4719327589105603f 100644 GIT binary patch delta 453 zcmWlW%T5$g5Qe|w%y>?pIf*Wm5u;{|kq|c|F5M`MAl_#{MCGEbG~+!_09zN-4`uT&-Vr)#6M{OjNMAHY#IG+i9`GMvyH zpkFee$}sBY0eZm%Q?+?E+{T4s;*trj4-OX#F#T)R*V<9!d1yN z$%IFVNrx$&VOs6ry0hNU_}rA-+S=R_GBeId0z0(rlbRJE2zqT*?Y8aQUfZ4fI#m~x zn*O}s7y41XZ!}FBQGKA(2xo#sa@)|LX}Ciu*f|)bK~nZxaVJX4@od@YEki_85*ymg zNfN_d(rlxl!@S*>uk2ZH^*zHP_p@UR4_Gohq-huOhqga5EVE)i=i9xjJT^Sxso@}N z0@aG6U~wdvGd$zDw+HZ7rJe&urBu7n%d=6;xJCe(nk30ccGdSEB1)DB-ZQ~ n@9*JPC|=XUX7-ae9OErj-Z9R5rm>`aV3m*dr=HBF%EjUTKAB=m delta 423 zcmWlVJyVlG6osEPZ`^%1I|B^_EHn%wLo0S^0!BXk07Hz5h(ypA;zts|pn@o(e5o@w z+iGKnqLPV~1wVjaVdeM_>@w~)=iYnnx#!ND_sPHQ>qpIBhd>{1HSJ_V2mP9p3`ovt z0tP~oWPNvDG3e`%XNE&YxRBr?mo%3dRg5XF_;pS*PF{1Bf)`#>Tu*R=3CT^#q^E9q zn9>ezs}`ocw5YkmjAXX{p)RBo-j&?5L&rX z1wD2{cG^PxU85Nvi-}KmG+Yy(?NRve^d5>Y^zhZCzE7HOne`aD}UyYnn!;*A+JmN2nQYax1gjnt8(lcNB{r$GDqe$qaE% zabNL3*dP4J>4ySBFz!z4viq4Ib1(CIV4S&b4Mtz_LzTC^nNPJ?G>D7v&Q*`OK_*aeusL*%-7)H;%e9Y|44IyL~A|!;6kWd&mQ4%X)0Qq$J5EKw$aoD{qvkU{w%-UjN zWqoTKJ1Zq56c)B5Q2Ga~{Sij4u{qC4-n>tq-=&+<#qFQ(KY+)y6#YyT?lGwtAn=${ zv=bEQW!l+{&oh^^4s$;9iUk&ZmVBN&t#~Xex(O63tU6osd7)Tm!{eo^dF8OF?y=>u z?eSW0dGS;FI|2k|)PD6#_E%fK{n++pg03@@o8T)4eZgJajr?pG=t=V;QwjBUU%eIOPzO8 u$|tt3P?7SfHHA-ua-1GH$paZMET?!VXBd;S1agjfxoC&fd-w2JE&K)0CsiE) diff --git a/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$QuestListPrompt$1.class b/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$QuestListPrompt$1.class index db5767ae382aa9448e84302807fc31ad2fd26923..5b5c7f1b7b2336e2a07f4c0f1c44b43c6f58c5d9 100644 GIT binary patch delta 29 lcmdnQxruYb4`wEYPm_N!dvGy)XJBRc!NAS%YqAeZ8UUop3OWD) delta 29 lcmdnQxruYb4`wDt{>i_XJ-8S}7+4ua8Mqn6C;PCZ0RVeX2C@JE diff --git a/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$QuestListPrompt.class b/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$QuestListPrompt.class index be06cc95c748600dce2e7c5cd001e8dc7ad7a7c7..634b76eb77b9164a1da87a91a604c3182dab3d62 100644 GIT binary patch delta 767 zcmXYuS4@;a6otRRh57eq5YWX0g18b*Bo<;xOf zxA%?(v8)w4A_{^ciVZ{}i9{cG&{t!eQD4rzbI;s!=iGUm{x!X{@psLAU<_S0!&%_g zkZ&`dfTY02MZisvg(fSsC^9i*Dq)i?ax;#_HcKeB8N$+7ma*Kx3du^FL`p15EmqmA zW{rWh7G*TdZgsMGsV>*E;y;tDLIlV#YL(Wm$)p59qIim5b}<+P3el_sv#p> zQ(WhUTODYwQs8u|s zP9U`Y6RMrs=m|;nX2esf1<`YZfq+l(Of!iw*`5X(O)=l^E7C0^6whgLf-%XXn|Yxf zDPGc|2|dP>7xESa!(QJ%1Kt8(z&}{>O3}(|!DRioQBJN*h*rFz&G{9R7W0-i!PNi6 zfRuNV_lggE6u1k`7H9ekLyC4foDw-U_7k0oNqiOzbp}NxJ8kla7-%fJvx51-qFLd* z{79j7&?Rajad94z@qkoqH;r1dsAG;cJC6qD(?}^zl+&y~vPG-6MzZ^siD@6`rw_?= zkWMEP=^~pi6w^%^Jyh_GD!%L0_v+PlQqK?Ligpo2k8sf|EGIspThur|6Q=(GvscF6 delta 744 zcmXAldrZw?7{@_xpXH@AG`0J@3b)hNRG)j+#0kgLadFWJlYO zV=@e%#Bbuj7tK&|wVGp)r#W9&0$K&NDlnPLJd^$ux|q)b4GSfUOk!DVu*4u_vXmkX z%M6z5nPP(#npZ}LY+PlqTEEs9tTianjq4278*I>Wqhym#_vt;GO}1beY&F>CqLl5D zGHvcK*r|D!WVcB=drbDS&tSjqKOi}%^ADLe9F`mrbemk@4Fof@0+k&-A{^zCqv80- zKB7yRGigmH?KR47hyTHs1^|C&drAQWdwkBZ!;rnd?a}2xjG^XJ+}cy)*3- zgNnP{vkz0;=Yid9ua3(Kxc#|7x99&UZokLp?I(Gtc*JADD9a-TS#Mo2PQ??Nt# z$fq{D<@khWlIMyRUI?P|^e;~F<^>cld1V#JAx0~0ijlmwYGqBh)Y#z=E#bjk;zUXt zy=fg!oJeU)aZ2TKOLKbuAWSe$btt^x_vu{AL7ym_R3m0*Zx$ o4I;|^6iKykQE&TAq8rVk53QmvpF}^ti2+td%m>k8^^BeL7r{}#RR910 diff --git a/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$QuestPointsPrompt.class b/build/classes/me/blackvein/quests/prompts/RequirementsPrompt$QuestPointsPrompt.class index 52d195a6b54ca5574f578673a4881dd8adcdcaf1..016a84c77b443e91a4e3dfad668b5cf57edac34f 100644 GIT binary patch delta 377 zcmWlVNiRcD0ENF>oeGp|=(`;x~L7TT3euiG>A1 zVwSM8u=O`^@8&rtZ{GLh&H2f{%RhYiy}Aaf**3_f*5{zkppbfv1_LkkKJsXEwqFe_a_{drEyM+F6&vHh4o5lhDXQG3ry#yiqhV$Ix>j1iTLGod~*7D~pM zluR+LF(a8}PGerOz@lV{sOtBY`j#azRs=yMoa+Z7PhEOzs#aN(n5;{Ri3@Ue(`L$! z>{v-VHD>NgHn21{C0ir}73xG3sX%7<;yCl$Bd%0h9}+j}UjHh8Kc@F~W5>iNvw&2wLVAD;j}2itBkE0V^bOCLjus7o-bs99oJv%;$2^mYY@0)jOV@-{VVtZO#@)lHHn=9Jl6UY?K6hofu;gA$`#LYZCcac|CM50mmQ`Gix$F= LndW^KW*F-a#>iHI delta 336 zcmW-dIZFdk7)8(f;$)ohAt~H~dt49+1Y;wJU?E~*A(&o5j5cE2w;1<**Qb>rmRd@z zQdo$UjflU%KOk5O;>7B5xNt7q%iwo~`}&)E0-{`Q7Wo9|vNn#F>uq9sk5Wle?^b6YSR%CM?gV_o4-#K#lK zF;Ah{U{j&$G+S(&W~;e%N3+YGW}gFvH4-12PAX(PgA0U za?Uj8TqwHDyDwsXtVX}#QqlE~G5?EcciOTY_Kz~dPFh5pPp4lbkd3&-Dk^0-Qb9n1 z1f`OwRMRUp3`#AdQpb#hxRVARy)Gv$JWJT5iazp|9^F|QBaF~T3<8DTPcdeYKcq8D AUH||9 diff --git a/build/classes/me/blackvein/quests/prompts/RequirementsPrompt.class b/build/classes/me/blackvein/quests/prompts/RequirementsPrompt.class index b4e18581323260660a25da6696d7f518c1d44b8f..e6dba72ab5f2218f0b0ccb80a9efccb380697fd5 100644 GIT binary patch literal 6216 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 diff --git a/build/classes/me/blackvein/quests/prompts/RewardsPrompt$CommandsPrompt.class b/build/classes/me/blackvein/quests/prompts/RewardsPrompt$CommandsPrompt.class index ee4aec0b4425ab6691a0f66720e31dbbfeb8cb11..00c59a63dc1da87f20481e91a89b82690de5a697 100644 GIT binary patch delta 491 zcmWlT%T5zv7>1t@7-u^C(Z-ly7bG5{5k*OGVHx z$=O_V=^~fn5|@p;;xJhnKgJpUD#SF1yz67 z&{*hA`tb?HOEb;UP|Q=;X{*sQrFg}HVC6&Kiv{UdyylJGuzL5tWkIpXJB4OR=*~x_ zl2o52ucg{ngQGI9huvR?7uhbFj4ZK7njDv9PDzWivPw3|BeF(b+C;KWO+M?>-M^Cy H2i2MX*`;!< delta 490 zcmW-cOKTHh6o#MEHqMvnhZYqyI~6L#3j=j&aUlpU+Krm1t+z3m#z`lWI+>)lRa5WU z*6Y}6UFp`Hxa*?gLcCO5h*H6Y;7{-ei1WF5&U@Y$-ou&C{n_09^ml0)=;N79FGsQ| z3O3s*S{$|MqL^hX$Ba6z7&3F%I42BF8k|y`HuH?hT%*n^N{X_=Q;gVDIH&LxRU=0& z0-GE~Ma}FxL&LhU#uVpmA{rL4sc9Ot>=fe`7c3@Tz5LbDlZr`;DU1HJ$>L(N*tybs zN!V0%TdothVZ}KdM}An@-}HmB7ilij)=YCHnd>U_O>fivKTqh5KyZ^UWt zXznqqxz7X5Lmmm;rFyOAhUG)vc>3X_CgHJ=PhNE9*JGE%}jDyMLz* HgZkh<5}I=l diff --git a/build/classes/me/blackvein/quests/prompts/RewardsPrompt$ExperiencePrompt.class b/build/classes/me/blackvein/quests/prompts/RewardsPrompt$ExperiencePrompt.class index 5d88fe85d98a1d3ceafa9148e4c1b59a53164efe..a9858d7803f112cb76d652de07aa80e9a57eb74a 100644 GIT binary patch delta 361 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 literal 4988 zcmb_g`FB*+9sk^!N#(el73lZ_#uY@snBBse;3nFKn}R$pcw$%DyEnD>Uo z?zUQOYg=2Z(v>b2?FtbSF>0-~SnXo>z1Y)p{Gq3RK?~G=?wdEsOc+XX+MF|Y`QGoo z-TU(Dzn^&?z-s)p3N0A)!&GoU!9fKn1w#RBM%s@|01AeyumOkUDyzVfvn_|5g2MqE z!BKg9Ou=1pewQ5HEr<6gc(0t_r{MhxKA_-k1s@Dh)Q4ta9qyThd+}j8+~>#r3O*uH zKN^6Bj|K1mKCa*s3O=deK?R?ZM4t}8gNOY1OaP5|M2dY>QXE(C*;)7;KJUjDB-$7K z_)-9C@Q8vhOQf&(@l`4AYkoW?@xLyIlK~EoD|kY|HxztR!M7BA+mG)ERN8~4Rkuo@ zF*;;~`%`-2;9(qz@ZeOSjET+6s3T?YOo{ z&{`iopdZ%5DLp+9j@el=JwT?y6qsLh5Fze>k>!cUtP@y}Kg!u=Dolm4x}A|{eoB)( z>DQU*K)>ecf<-bXl$jl~8P{$4u;W$cy&vDD4tgSC4BNZ)l$q3RBN<5#=O{TbL-Q{e zSbt^RClbh;Ni*gmBH*=;WCSYAyz~HrAtMw?GOX=0RK<;i<5ih0^k`Mg97yYSE=y^B z|0BCiMWzB2YawZ|IN~{#Nt1 zhQFIsbm5f1!l`(hb7m@OWaaT`6(e|3#Th&$Ft1sYzSCTZT5~`ijH(#J)6~jz{K`Yi zkFzSC!MKWN@uUD$JSUkvFNg0*$P%qtiy5{iNwmloOABphz%&f#4iL!ikF^-U^eouJN+^RtoeZhdPw_K>b<^&R zPJ3bU78=!T8IXy+jM&dr`~tsJ@hj=XYvY-mHk7k$>Doze?>DoSz08katN0CmE3kfM z@+Ui`6xc1$Ix~7Vkqb7=lQv9&)kv6@&0h;zLWbB#u2k_m{GK6jqBc>6D*k|11nQ@) zgo;1nPb&V5zexShv$^#S8k!qgC%savZUTIII>{+0L#`D<>z>t8BQ2e=HJh}SKE%Pi z%UC9`;)>n9+dOI{nf3+4gOhg9T&GD3)Q0vI^#QlX%A3s_a_+aSJEE-Z+TtGAIjGy6 znUvGwEA`=FBb^jz4i&N4(SN{5l)FmYQfHSb!7qp{Vvz?;;wyG04`P0Y%HB~;S9C;~ zYcAjBVuoe$BHW_ey1yne>nu?yTSXVFWINlYF?$|^4)}D^IfWjzF z__(;07kn=-$U)uO?p%=c_Fj^volU8MlX5$D^>s+bX?e@#cm)GbP=DRxRBOnd!!U0~l#-byog(X_P6 z#FIB?cP6`MFf$|&V#Kc+T|TquQg2Te^R;d|*vtWox!a>3*~UE32d-o;wIQNik}NBV z{o+QbD0>S9KvJKqQ>I7$3CbQ>))h{;ESVDf^#or}$9N-M8L>N$L-daFL2%h!or83B zW4ZhpF85TfYvKF8gbi4t^{^X1a(EEjM&f*J{^b;(Pp z7Rr-FR7kTQDHd^UF;jh^-rUYfZz=UJ>Gn_F?gfn&rKz?QxzgDyqf46(Z|ZE_1ul!*u&a+8}-xRzligG#4n=VkG=mw_XTtm z*6kN?5I*d~+eyco_N?QM6({0NvThoVqk0^T@rE-HVhl~Enu3fzp`C@&Yi=Axvm5mh ztdvC*&PVkuR(UXv7KeBYt51z%O@Yx(WW-pIQELgkQ=T^$(Nl~V#abq&oQk5C=ES> z)-h~4Ric<<*juTX+kx7gr31ZX652iq?ckCv>M|#Y$&~5GB09PWRic?`vyy2OMo6sU ztG5L`On^JY%@`DGaj#g12gG_jBsSoL*oY^@Ef^8)cu8#LhsGAXCc5x9u@!HK2>u~% z6GBAA?P8nQBX$IWMOlTKFHP+bN}y^TV9ia6ZBLHO{D3{sV#$ BMGXJ| diff --git a/build/classes/me/blackvein/quests/prompts/RewardsPrompt$MoneyPrompt.class b/build/classes/me/blackvein/quests/prompts/RewardsPrompt$MoneyPrompt.class index bfc12f89750eb5fce123a5be62edc7218ebeb040..d2c994104b81c8d7db59d4c1a5e60ae19db7b20c 100644 GIT binary patch delta 423 zcmXw#IZu>P6o#M6jNI?L+z16jkYvozn2^|LLI@2wAc6~#11w1R9W<6uV7RxSdCxiTdvZ?l97onmrvLu`{Rg)JU3@9sulA&K;c7*Jf3`-KGDsMw31qgb+9$q#1p*8W$Y=z3| zBqN$pQkv(a1w{>+Tp}AA7z-vcxmb{lIe$!(Atebk2UO7otSX$?pH51MIa1eNAmezEzN7craROBZLElgw)t_$a72j|w%PSkx@B ztSM*3oQAhW)TMrXkPfn4xzY6g#)X!UST#r9l=x;w{DbHw9^bjbmZiTl? O#kFfXRIlCMQ%z^{$65sd delta 423 zcmXAl%S)6|7{-6caXjC5=6KmCArzmRz;Gomm^U85a_L2RG0AzR&aUJn(+0I4#c~{o6eRYFSoP(C7wmO>v2+ zq)Aao)TNSUyR|s9+IihFH(c7d8KIpHMJKl$ZaZ{Y`Htc)-HIN1t+CIcKf*l*B!dq3 zEkC3f=7Hp4pqDaYU85?1G0FIk&+9@CN+u+e=4!!L851BFS~;#UMWHn@WxjIt#`B;~ zGsg?fOX7kH(etciHsgEaF>fZFN%)CetV%MkdBtl%ok@kSn7oLX&BEf6JPVRV%^Q{k z)qzx9s(H&h&3is*s`$7X{{Hh%xHBX+Oo=-$w#+B@@5Ns@Y;&2N;QPDOvqv-gba21` NzfDdJ2ksNq_8;B^T8jVx diff --git a/build/classes/me/blackvein/quests/prompts/RewardsPrompt$PermissionsPrompt.class b/build/classes/me/blackvein/quests/prompts/RewardsPrompt$PermissionsPrompt.class index 43568877749cbe1a879e058fde8171468f9060b9..72394192e11ecc0887a305dd5d1f764a9da728e7 100644 GIT binary patch delta 385 zcmWm4%}N_l7>Dua)udQ`<$`@!$K)YhaK=O()OY2E&>zGKvvR zf{e>3V{wf;OvHCGX38O}ndXJVjKgf4bBdRmRx+AbypHRQ!@OpJw~9rVc9vq^=?3o= z9~8^Nx8vVUDkmW1KHm)3TJx!_*w#enL&d6LjdjBYc{`Li>ffMX@c1Y^@bV?k4;8*) zlPw|Xg?_#w$P>dhfxS(1^zImT2@OR`!lOOEQVgOfD3|8_!$?s!?6EKO*?O`sWvCDt zsvH=4s0q&+bHA<1WBVn!*3(_|(}gha?biIDl-@t^qiU2MD~ILEVl@aa?vnqS2Kh8Q(W=ZxW3fBH4&!A!VT$=i@k^hhdBl!lVP{f)0KF?4|3P*Z zvapihfUKMnWi9h2+YHzYx;kVLQWOzX3^U@|sLhySoC%9b_h!n)w8~+|V%B0#xXj+=S@Qxy z`0Tdc9OR!%*c5rnlxBfNO@t-W>^Z87u&jx)A{4};$(WO{h-p@F1aBKNhSaQ diff --git a/build/classes/me/blackvein/quests/prompts/RewardsPrompt$QuestPointsPrompt.class b/build/classes/me/blackvein/quests/prompts/RewardsPrompt$QuestPointsPrompt.class index 143fae5d63c495247ccd9c908d480306a8b5c321..78c3d267162fb68ab42af4ef387230930d1e918e 100644 GIT binary patch delta 371 zcmWlVJ#SJ`0EVA~SI@nd6GK8nZ48M+Lrh47n6$KDRX(&>#4n_R#nx+~aPbxr#I6lL zz=52}$z2Cy+&VPr;-GO+QR86z0nWzB$X%ZI&6{U>C*i;0{rCS44uSLZZ9*(qQ!Lt? zA|+X}F-Tb~llEK2^TX~>9rG;;lS;+ zb5C8b*&0YHin~-5>)g{XkJY2=)D(5@OEwe@9!NG7TRc=aRP`AnYCTeH(-dTMR%GQywef0 mEI#O_`8xUulh4HXGJSGFny(c2Mv3p#_@R?lV`@LMivIyx1W;rE delta 343 zcmWlVyDvjw7>A#)TIclmQj$tYL{f=Jnl2)ts9V*gRNd;*Qg=mBByFuCk(lM1{RJY3 zt%JnMY$Fz%dn_h#&hor(e!pjV-(UBG`{3@ca04`uF({+aX`;!X62C^XfgQh-a$2md zRVQH0HVf?r9dsIW5wwJEolprq^lJ3!^jmq@V1Pl5h}92Sh#Dq_HAV!*xs7zTwq787 z>elAFI&;~?s4Cd*?PG!pb?T@vB;&*+6HKb}qC{wdDakZ(jf7-|S&gJ*j(N!fF+pW8 zvzy<^c{2HI&a<5I?CoaLx%7UjMq^R3#Ihiuf+C=f>~7Zzs~RcE8tVe@$)UGYvO!w1 z$(E#wZS`bdxK27AZQ@zA=uz>aj`fS`S9IQ}arz=1iLQr8E2w DlkiAE diff --git a/build/classes/me/blackvein/quests/prompts/RewardsPrompt$mcMMOAmountsPrompt.class b/build/classes/me/blackvein/quests/prompts/RewardsPrompt$mcMMOAmountsPrompt.class index c6a38ae75adaf2ccf602994a65e725c79454c5f3..135e0b154f142db5c633bffa930c32397cbe53b9 100644 GIT binary patch delta 439 zcmW;JzfTik0LJm}`+|Mj;~g+yNQvmVfeuHQKv|3?#z-~B=;FdzFM9OtUFqFbKxp}4 z0ktaiMB?b; z&%A|4T@hKFrfWj82$CJWK5vmp?+<`Hed;GElVoh0^+Gvfyp@9vBr#fnYM7TcP~ zJkdO*lP%CZ3hq7-9?`ck1OO!~c061Dw7Yg9}%D98o+%%NXd-XD=9He!?N#~8tycw&R@>gnV zYST@kRt4e0G^im#3vp4KTn4S%2mJ*RJ@<$6IedXhdtK6evcz>u-AP&!(5^uAOW?({j&npQ@q8 z1N)+Rbh^ev!!$FBSk?=&e&nebW|>nc*D%i`McZw!;-$)AZXz|93&#DMgSk?uSuiZJ zWO&T7VTIMG!0?1M!}`g>2319en=83NA#`sQeJ}KjZaC%z?uB!jr-nMuniN;88%x=D zr$*XO=db%(5dQk@F)x$JwVKEkvJfpG2WyA~F&G00$bAG60w`=?fhC&+b~m7ct{32i z90MwfiW~we8j`pXq6msXQMnWeU;%}NR7v?utFRQ0ev^btf4EiC-ShSJ^}ODo>76%N<1gARN{Gw zWh!vFh7~#lR%$SH^uTJ>?FAM3qQpzFSc8`}yrLr4YIs#g4pvLNu7cKSctdqruVF(B z`e36Hn{*a$N^F+cBB5`UcuV4K4e!*&)1PGbYuHwoU^_~-{up4Mx8Gtb!n@Tq~l_>ACm^Dob8UMlz6k)%C zFY%RuuNA!xrB&7Lit13<9rE#`h6uT5_=BNv7Yzpt9K<0)U)8`Y){>k>C?@o?UKeQt z+8@Rdp5NkC9rg!2!~LPKfp74wc}D9QcNE_lIEH4`^tjnkj-+m8PHcN~nJn&{TH*7Q z1-#SB=lT4Vp1IY&P&ni%stQyE$8n*$!*Vy-PY@=VV<@X`kA9dsdU!_xN=yWw7+Vey z*DYo_(A;L^dIm8T4;zOZfP)U93mw7Tj2RpObj4r{V@(*25h|xHA#Q_+sH8ziV*D6V zs2OQ=9OLK&s^}y((f2q-r|CvIL%DR8rqYk(r}MO)exhc&Ko{v}aWnlQCep8BIsIle z8w`zdk%5sI1v{lN)zKIO8(n0q1Y;Tdp$!AX%Au{S*u*^;$GlR+Lfp&A0^^yQ8`>qD z(lFr?3N@7ej>13C|0=s2c1*-1HIKOIm|A2-5$np1A})&f z9q1`|Ej^_f^`HjaTGNOe%jTC}HCZl46y4V#|C;<{m7jZ6ex@sdqPQ*7m9Es))goCg zr&VD)$1s&9B)1s5(R&B-2nCzruoZBoboEF1Ui;#pZu~2CCtYZR1S<%FvFt;cvtU@L>?r zgg|$}K4C|RaAJy(m?dJcSm;`Ej$0`SF~d15NyRjrEQzSR?DU+Y|7bq?#-SbxD9iSi%Jj&KqH delta 1643 zcma)6`&U#|6#mYhVeXmB1;!CDG~ueX1Yv?i5nl)uAfkw%5o!VIlp`R-jM~GRp4!V& zuRSa?(@gC-!Zd^wSs9i+>}A{qCvl68TXCB@ zzFlIy!aJ0>Q;D#|T?+4(xJTk%iTfn(*E!XOcobk`I35q+K_woNcvul1k=P{hsKjFu zn-y`3hOIgXmWFLQvhak&lPcj;ioIRp>3BSY9U7ihv#;cV6r>2fC-u1>lQyonxxMEkI|IndI=grJ5) z272+9fwvJAfPp?0=^Z5wD@&T`Gi&`JGpIa*W@c5}YQGuuhq5^8yNFtQ<7&n&!*T=f z;eD>tz!7|4pdUvCTqgf~rhyNcH_}z>xDm^(c2}zFBODW$VznC+rdEXftraVR)g5iE z?ID4LAq@2d zxQ?9(^<0_>?Ho>NSbPq}8kYQl;y+Pxk=_g^mg0KVkG0X`3unjRISL;`PA_DAH{6}@ z#SrhkB8G$*5_^zKykmLw6QU5^xH8guNTnw4pF@1=Cit?Xyk$<)~NyIQY z+dEFd#nIApye>P!LFRBN{YV*54x^xl*KEPCw6IbH3Y`1kauhg6r#N>ZtrvxM6;Vu8 zg+(!~8`C30s<6A5!BuoZR|UgJc>6266exM>m( zelp*F0WxU{%BT=EGz|?j11o7JHc$~Z(JXAEV(g+49H26EQaO%L1^THH$7wEpp(>oA zYWz+MgrHhcNee|C)eUY1zo8D?fQDj*)BJBl1K(XgwkRV%pFziY8$|u!RrL2hFAm3FuQ<}!}u2J`rfTFLe-#>W{aGVWshm=PZN4?t~7kpKVy diff --git a/build/classes/me/blackvein/quests/prompts/RewardsPrompt$mcMMOSkillsPrompt.class b/build/classes/me/blackvein/quests/prompts/RewardsPrompt$mcMMOSkillsPrompt.class index 51828f9e51239d19882ff843638febf64391ac93..a5a73161c3f0de80d7f66146669f9bfc78c48d97 100644 GIT binary patch delta 1196 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 TBy1wQim-+7YC=EZHL(2;(C#K2 diff --git a/build/classes/me/blackvein/quests/prompts/StagesPrompt.class b/build/classes/me/blackvein/quests/prompts/StagesPrompt.class index 81529893396ccb34ef463732d0147cc3e86c8846..ed2be6fef5edc1ef6f7d61c7911b590650dbfc77 100644 GIT binary patch delta 1767 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 aAu_zfDU@OECWBkVSS}YAPl<7eRsRELM*b%N diff --git a/build/classes/me/blackvein/quests/stageDataNames.txt b/build/classes/me/blackvein/quests/stageDataNames.txt index 7810079bf..0addd757a 100644 --- a/build/classes/me/blackvein/quests/stageDataNames.txt +++ b/build/classes/me/blackvein/quests/stageDataNames.txt @@ -28,12 +28,22 @@ stage#deliveryMessages stage#npcIdsToTalkTo +stage#npcIdsToKill +stage#npcAmountsToKill + stage#mobTypes stage#mobAmounts stage#killLocations stage#killLocationRadii stage#killLocationNames +stage#bossIds +stage#bossAmounts +^^^^ +boss-ids-to-kill +boss-amounts-to-kill +^^^^ + stage#reachLocations stage#reachLocationRadii stage#reachLocationNames @@ -44,9 +54,6 @@ stage#tameAmounts stage#shearColors stage#shearAmounts -stage#npcIdsToKill -stage#npcAmountsToKill - stage#event stage#delay diff --git a/build/classes/plugin.yml b/build/classes/plugin.yml index ddcdd1142..21897da36 100644 --- a/build/classes/plugin.yml +++ b/build/classes/plugin.yml @@ -1,6 +1,6 @@ name: Quests main: me.blackvein.quests.Quests -version: 1.5.4 +version: 1.6.4 description: Player questing system website: http://dev.bukkit.org/server-mods/quests/ dev-url: https://github.com/Blackvein/Quests/ @@ -46,6 +46,9 @@ permissions: quests.admin.points: description: Set a players Quest Points default: op + quests.admin.pointsall: + description: Set all players' Quest Points + default: op quests.admin.finish: description: Immediately force Quest completion for a player default: op @@ -55,11 +58,29 @@ permissions: quests.admin.reload: description: Reload all Quests default: op + quests.editor.editor: + description: Open Quests Editor + default: op quests.editor.create: description: Create new Quests default: op - quests.editor.events: - description: Create/Edit/Delete Events + quests.editor.edit: + description: Edit Quests + default: op + quests.editor.delete: + description: Delete Quests + default: op + quests.editor.events.editor: + description: Open Events Editor + default: op + quests.editor.events.create: + description: Create new Events + default: op + quests.editor.events.edit: + description: Edit Events + default: op + quests.editor.events.delete: + description: Delete Events default: op commands: quests: diff --git a/build/classes/quests.yml b/build/classes/quests.yml index 4af2f299e..3a883e9bd 100644 --- a/build/classes/quests.yml +++ b/build/classes/quests.yml @@ -5,10 +5,8 @@ quests: finish-message: 'Well done. Here is your reward.' redo-delay: 1800000 requirements: - item-ids: - - 270 - item-amounts: - - 1 + items: + - id-270:amount-1 remove-items: - false fail-requirement-message: 'You must have a Wooden Pickaxe first.' @@ -52,7 +50,7 @@ quests: - 1 rewards: - item-ids: [276] - item-amounts: [1] + items: + - id-276:amount-1 exp: 100 quest-points: 1 \ No newline at end of file diff --git a/nbproject/.DS_Store b/nbproject/.DS_Store index 574ffdf6843e6e57e92584402724dcc45894905e..67fb84f8a10d7dfe7bd808080937cc0930cb0c06 100755 GIT binary patch delta 219 zcmZoMXfc=|#>B`mu~2NHo}wrV0|Nsi1A_nqLn1>7LuyXCVQ_N(#KPtEAPIJc0)`@n zOolRK$=m{<3=lBR1rlf~a`RnWQc6pb85qu*Z(0UchM^*bfQo_)kP|pz)+lUtWIo2S kIe>W`<7Rdaeh#41fg<0TC-aL~a)8~zz`(RQKx7Lu0QaXbz5oCK delta 363 zcmZoMXfc=|#>B)qu~2NHo}wr#0|Nsi1A_nqLkfc~LncEmLjgn1=7o&Q8S6n(d<;np zr9j~vWN8LHh6+DnlMa8d!fSLorZa z0Yec(K9EcW(j`D~peULtXJDo<{r^9?fKj9#Rh}^jCjb9G$Pxx2sF_(nvyy>k5@849 z4Ky>jG0Z^tPZZUIGaw!WhR|h}&Fmcf9KfIia=tT9<`=Q#0EQ$GF)(Zn5ZS^E05>RI A;Q#;t diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties index cb35e40eb..dae6e0247 100755 --- a/nbproject/private/private.properties +++ b/nbproject/private/private.properties @@ -3,4 +3,4 @@ do.depend=false do.jar=true javac.debug=true javadoc.preview=true -user.properties.file=C:\\Users\\Alex\\AppData\\Roaming\\NetBeans\\7.2.1\\build.properties +user.properties.file=/Users/136-aclarke/Library/Application Support/NetBeans/7.2.1/build.properties diff --git a/nbproject/project.properties b/nbproject/project.properties index d39fde3ad..ee28990a7 100755 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -27,10 +27,10 @@ dist.jar=${dist.dir}/Quests.jar dist.javadoc.dir=${dist.dir}/javadoc endorsed.classpath= excludes= -file.reference.craftbukkit-1.5.1-R0.1.jar=lib/craftbukkit-1.5.1-R0.1.jar +file.reference.craftbukkit-1.5.2-R0.1.jar=lib/craftbukkit-1.5.2-R0.1.jar file.reference.denizen-0.8.8-PRERELEASE.jar=lib\\denizen-0.8.8-PRERELEASE.jar +file.reference.EpicBossRecoded.jar=lib/EpicBossRecoded.jar file.reference.mcMMO.jar=lib\\mcMMO.jar -file.reference.mysql-connector-java-5.1.24-bin.jar=C:\\Users\\Alex\\Documents\\Coding\\libraries\\mysql-connector-java-5.1.24-bin.jar file.reference.Vault.jar=lib/Vault.jar includes=** jar.archive.disabled=${jnlp.enabled} @@ -42,8 +42,8 @@ javac.classpath=\ ${libs.CitizensAPI.classpath}:\ ${file.reference.mcMMO.jar}:\ ${file.reference.denizen-0.8.8-PRERELEASE.jar}:\ - ${file.reference.mysql-connector-java-5.1.24-bin.jar}:\ - ${file.reference.craftbukkit-1.5.1-R0.1.jar} + ${file.reference.craftbukkit-1.5.2-R0.1.jar}:\ + ${file.reference.EpicBossRecoded.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false diff --git a/src/.DS_Store b/src/.DS_Store index 88774d4dc02cec2f6aea74c6e2061a4bb6a77225..e742895c09ea12623d766bc809e6e2359261a951 100644 GIT binary patch delta 174 zcmZoMXfc=|#>CJ*u~2NHo}wrV0|Nsi1A_oVa(-?Bkj=orz2(EiLiKo%1QSCpLuyXC zVKA~JOguN=#U-V*B$B`mu~2NHo}wr#0|Nsi1A_nqLncEygC0XALoP$k#E;ACK@waH$qe}n zc?@aDlAbyF$w@i+NkDm^E(SLs*7y$wKo&?(Dnl6%=P{Hp6vGTe({lz*4-?SRR8%$f zj6rCMxEKl;au`a1uFM1)4s|K2CdL~WdJ2I$Qh^S^?HG^;W*~V0$OVFpfBvy>>>>>> Starting rewards item data +max-party-size: 0 +party-invite-timeout: 20 +broadcast-party-creation: true quester-blacklist: - "SomeGuy12345" - "somePrefix*" - "*someSuffix" - - "*someRegex*" - - - + - "*someRegex*" \ No newline at end of file diff --git a/src/me/blackvein/quests/ColorUtil.java b/src/me/blackvein/quests/ColorUtil.java new file mode 100644 index 000000000..65a189b60 --- /dev/null +++ b/src/me/blackvein/quests/ColorUtil.java @@ -0,0 +1,31 @@ +package me.blackvein.quests; + +import org.bukkit.ChatColor; + +public interface ColorUtil { + + static final ChatColor BOLD = ChatColor.BOLD; + static final ChatColor ITALIC = ChatColor.ITALIC; + static final ChatColor UNDERLINE = ChatColor.UNDERLINE; + static final ChatColor STRIKETHROUGH = ChatColor.STRIKETHROUGH; + static final ChatColor MAGIC = ChatColor.MAGIC; + static final ChatColor RESET = ChatColor.RESET; + static final ChatColor WHITE = ChatColor.WHITE; + static final ChatColor BLACK = ChatColor.BLACK; + static final ChatColor AQUA = ChatColor.AQUA; + static final ChatColor DARKAQUA = ChatColor.DARK_AQUA; + static final ChatColor BLUE = ChatColor.BLUE; + static final ChatColor DARKBLUE = ChatColor.DARK_BLUE; + static final ChatColor GOLD = ChatColor.GOLD; + static final ChatColor GRAY = ChatColor.GRAY; + static final ChatColor DARKGRAY = ChatColor.DARK_GRAY; + static final ChatColor PINK = ChatColor.LIGHT_PURPLE; + static final ChatColor PURPLE = ChatColor.DARK_PURPLE; + static final ChatColor GREEN = ChatColor.GREEN; + static final ChatColor DARKGREEN = ChatColor.DARK_GREEN; + static final ChatColor RED = ChatColor.RED; + static final ChatColor DARKRED = ChatColor.DARK_RED; + static final ChatColor YELLOW = ChatColor.YELLOW; + + +} diff --git a/src/me/blackvein/quests/EpicBossListener.java b/src/me/blackvein/quests/EpicBossListener.java new file mode 100644 index 000000000..99ff8743e --- /dev/null +++ b/src/me/blackvein/quests/EpicBossListener.java @@ -0,0 +1,32 @@ +package me.blackvein.quests; + +import me.ThaH3lper.com.Api.BossDeathEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + + +public class EpicBossListener implements Listener{ + + final Quests plugin; + + public EpicBossListener(Quests quests){ + + plugin = quests; + + } + + @EventHandler + public void onBossDeath(BossDeathEvent evt){ + + String boss = evt.getBossName(); + Player player = evt.getPlayer(); + Quester quester = plugin.getQuester(player.getName()); + if(quester.hasObjective("killBoss")){ + quester.killBoss(boss); + } + + + } + +} diff --git a/src/me/blackvein/quests/Event.java b/src/me/blackvein/quests/Event.java index 703a35e76..1b8cea820 100644 --- a/src/me/blackvein/quests/Event.java +++ b/src/me/blackvein/quests/Event.java @@ -2,6 +2,7 @@ package me.blackvein.quests; import java.io.File; import java.util.*; +import me.blackvein.quests.util.ItemUtil; import org.bukkit.*; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -13,23 +14,20 @@ import org.bukkit.potion.PotionEffect; public class Event { String name = ""; - String message = null; boolean clearInv = false; LinkedList explosions = new LinkedList(); Map effects = new HashMap(); - Map items = new EnumMap(Material.class); + LinkedList items = new LinkedList(); World stormWorld = null; int stormDuration = 0; World thunderWorld = null; int thunderDuration = 0; - LinkedList mobSpawnLocs = new LinkedList(); LinkedList mobSpawnTypes = new LinkedList(); LinkedList mobSpawnAmounts = new LinkedList(); - LinkedList lightningStrikes = new LinkedList(); - + LinkedList commands = new LinkedList(); LinkedList potionEffects = new LinkedList(); int hunger = -1; int saturation = -1; @@ -37,114 +35,142 @@ public class Event { Location teleport; @Override - public boolean equals(Object o){ + public boolean equals(Object o) { - if(o instanceof Event){ + if (o instanceof Event) { Event other = (Event) o; - if(other.name.equals(name) == false) + if (other.name.equals(name) == false) { return false; + } - if(other.message != null && message != null){ - if(other.message.equals(message) == false) + if (other.message != null && message != null) { + if (other.message.equals(message) == false) { return false; - }else if(other.message != null && message == null){ + } + } else if (other.message != null && message == null) { return false; - }else if(other.message == null && message != null) + } else if (other.message == null && message != null) { return false; + } - if(other.clearInv != clearInv) + if (other.clearInv != clearInv) { return false; + } - if(other.explosions.equals(explosions) == false) + if (other.explosions.equals(explosions) == false) { return false; + } - if(other.effects.entrySet().equals(effects.entrySet()) == false) + if (other.effects.entrySet().equals(effects.entrySet()) == false) { return false; + } - if(other.items.entrySet().equals(items.entrySet()) == false) + if (other.items.equals(items) == false) { return false; + } - if(other.stormWorld != null && stormWorld != null){ - if(other.stormWorld.equals(stormWorld) == false) + if (other.stormWorld != null && stormWorld != null) { + if (other.stormWorld.equals(stormWorld) == false) { return false; - }else if(other.stormWorld != null && stormWorld == null){ + } + } else if (other.stormWorld != null && stormWorld == null) { return false; - }else if(other.stormWorld == null && stormWorld != null) + } else if (other.stormWorld == null && stormWorld != null) { return false; + } - if(other.stormDuration != stormDuration) + if (other.stormDuration != stormDuration) { return false; + } - if(other.thunderWorld != null && thunderWorld != null){ - if(other.thunderWorld.equals(thunderWorld) == false) + if (other.thunderWorld != null && thunderWorld != null) { + if (other.thunderWorld.equals(thunderWorld) == false) { return false; - }else if(other.thunderWorld != null && thunderWorld == null){ + } + } else if (other.thunderWorld != null && thunderWorld == null) { return false; - }else if(other.thunderWorld == null && thunderWorld != null) + } else if (other.thunderWorld == null && thunderWorld != null) { return false; + } - if(other.thunderDuration != thunderDuration) + if (other.thunderDuration != thunderDuration) { return false; + } - if(other.mobSpawnLocs.equals(mobSpawnLocs) == false) + if (other.mobSpawnLocs.equals(mobSpawnLocs) == false) { return false; + } - if(other.mobSpawnTypes.equals(mobSpawnTypes) == false) + if (other.mobSpawnTypes.equals(mobSpawnTypes) == false) { return false; + } - if(other.mobSpawnAmounts.equals(mobSpawnAmounts) == false) + if (other.mobSpawnAmounts.equals(mobSpawnAmounts) == false) { return false; + } - if(other.lightningStrikes.equals(lightningStrikes) == false) + if (other.lightningStrikes.equals(lightningStrikes) == false) { return false; + } - if(other.potionEffects.equals(potionEffects) == false) + if (other.commands.equals(commands) == false) { return false; + } - if(other.hunger != hunger) + if (other.potionEffects.equals(potionEffects) == false) { return false; + } - if(other.saturation != saturation) + if (other.hunger != hunger) { return false; + } - if(other.health != health) + if (other.saturation != saturation) { return false; + } - if(other.teleport != null && teleport != null){ - if(other.teleport.equals(teleport) == false) + if (other.health != health) { + return false; + } + + if (other.teleport != null && teleport != null) { + if (other.teleport.equals(teleport) == false) { return false; - }else if(other.teleport != null && teleport == null){ + } + } else if (other.teleport != null && teleport == null) { return false; - }else if(other.teleport == null && teleport != null) + } else if (other.teleport == null && teleport != null) { return false; + } } return true; } - public String getName(){ + public String getName() { return name; } - public void happen(Quester quester){ + public void happen(Quester quester) { Player player = quester.getPlayer(); - if(message != null) + if (message != null) { player.sendMessage(Quests.parseString(message, quester.currentQuest)); + } - if(clearInv == true){ + if (clearInv == true) { player.getInventory().clear(); } - if(explosions.isEmpty() == false){ + if (explosions.isEmpty() == false) { - for(Location l : explosions){ + for (Location l : explosions) { l.getWorld().createExplosion(l, 4F, false); @@ -152,9 +178,9 @@ public class Event { } - if(effects.isEmpty() == false){ + if (effects.isEmpty() == false) { - for(Location l : effects.keySet()){ + for (Location l : effects.keySet()) { l.getWorld().playEffect(l, effects.get(l), 1); @@ -162,28 +188,29 @@ public class Event { } - if(items.isEmpty() == false){ + if (items.isEmpty() == false) { - for(Material m : items.keySet()) - Quests.addItem(player, new ItemStack(m, items.get(m))); + for (ItemStack is : items) { + Quests.addItem(player, is); + } } - if(stormWorld != null){ + if (stormWorld != null) { stormWorld.setStorm(true); stormWorld.setWeatherDuration(stormDuration); } - if(thunderWorld != null){ + if (thunderWorld != null) { thunderWorld.setThundering(true); thunderWorld.setThunderDuration(thunderDuration); } - if(mobSpawnLocs.isEmpty() == false){ + if (mobSpawnLocs.isEmpty() == false) { - for(Location l : mobSpawnLocs){ + for (Location l : mobSpawnLocs) { - for(int i = 1; i <= mobSpawnAmounts.get(mobSpawnLocs.indexOf(l)); i++){ + for (int i = 1; i <= mobSpawnAmounts.get(mobSpawnLocs.indexOf(l)); i++) { l.getWorld().spawnEntity(l, mobSpawnTypes.get(mobSpawnLocs.indexOf(l))); @@ -193,9 +220,9 @@ public class Event { } - if(lightningStrikes.isEmpty() == false){ + if (lightningStrikes.isEmpty() == false) { - for(Location l : lightningStrikes){ + for (Location l : lightningStrikes) { l.getWorld().strikeLightning(l); @@ -203,9 +230,18 @@ public class Event { } - if(potionEffects.isEmpty() == false){ + if (commands.isEmpty() == false) { - for(PotionEffect p : potionEffects){ + for (String s : commands) { + quester.plugin.getServer().dispatchCommand(quester.plugin.getServer().getConsoleSender(), s.replaceAll("", quester.name)); + + } + + } + + if (potionEffects.isEmpty() == false) { + + for (PotionEffect p : potionEffects) { player.addPotionEffect(p); @@ -213,25 +249,25 @@ public class Event { } - if(hunger != -1){ + if (hunger != -1) { player.setFoodLevel(hunger); } - if(saturation != -1){ + if (saturation != -1) { player.setSaturation(saturation); } - if(health != -1){ + if (health != -1) { player.setHealth(health); } - if(teleport != null){ + if (teleport != null) { player.teleport(teleport); @@ -239,46 +275,48 @@ public class Event { } - public static Event getEvent(String name, Quests plugin){ + public static Event loadEvent(String name, Quests plugin) { - if(name == null || plugin == null) + if (name == null || plugin == null) { return null; + } Event event = new Event(); FileConfiguration data = new YamlConfiguration(); - try{ + try { data.load(new File(plugin.getDataFolder(), "events.yml")); - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } String eventKey = "events." + name + "."; event.name = name; - if(data.contains(eventKey + "message")) + if (data.contains(eventKey + "message")) { event.message = data.getString(eventKey + "message"); + } - if(data.contains(eventKey + "clear-inventory")){ + if (data.contains(eventKey + "clear-inventory")) { - if(data.isBoolean(eventKey + "clear-inventory")) + if (data.isBoolean(eventKey + "clear-inventory")) { event.clearInv = data.getBoolean(eventKey + "clear-inventory"); - else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "clear-inventory: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a true/false value!"); return null; } } - if(data.contains(eventKey + "explosions")){ + if (data.contains(eventKey + "explosions")) { - if(Quests.checkList(data.getList(eventKey + "explosions"), String.class)){ + if (Quests.checkList(data.getList(eventKey + "explosions"), String.class)) { - for(String s : data.getStringList(eventKey + "explosions")){ + for (String s : data.getStringList(eventKey + "explosions")) { Location loc = Quests.getLocation(s); - if(loc == null){ + if (loc == null) { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + loc + ChatColor.GOLD + " inside " + ChatColor.GREEN + "explosions: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not in proper location format!"); Quests.printSevere(ChatColor.GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); return null; @@ -288,35 +326,35 @@ public class Event { } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "explosions: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of locations!"); return null; } } - if(data.contains(eventKey + "effects")){ + if (data.contains(eventKey + "effects")) { - if(Quests.checkList(data.getList(eventKey + "effects"), String.class)){ + if (Quests.checkList(data.getList(eventKey + "effects"), String.class)) { - if(data.contains(eventKey + "effect-locations")){ + if (data.contains(eventKey + "effect-locations")) { - if(Quests.checkList(data.getList(eventKey + "effect-locations"), String.class)){ + if (Quests.checkList(data.getList(eventKey + "effect-locations"), String.class)) { List effectList = data.getStringList(eventKey + "effects"); List effectLocs = data.getStringList(eventKey + "effect-locations"); - for(String s : effectList){ + for (String s : effectList) { Effect effect = Quests.getEffect(s); Location l = Quests.getLocation(effectLocs.get(effectList.indexOf(s))); - if(effect == null){ + if (effect == null) { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + s + ChatColor.GOLD + " inside " + ChatColor.GREEN + "effects: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a valid effect name!"); return null; } - if(l == null){ + if (l == null) { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + effectLocs.get(effectList.indexOf(s)) + ChatColor.GOLD + " inside " + ChatColor.GREEN + "effect-locations: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not in proper location format!"); Quests.printSevere(ChatColor.GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); return null; @@ -326,74 +364,56 @@ public class Event { } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "effect-locations: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of locations!"); return null; } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is missing " + ChatColor.RED + "effect-locations:"); return null; } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "effects: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of effects!"); return null; } } - if(data.contains(eventKey + "item-ids")){ + if (data.contains(eventKey + "items")) { - if(Quests.checkList(data.getList(eventKey + "item-ids"), Integer.class)){ + if (Quests.checkList(data.getList(eventKey + "items"), String.class)) { - if(data.contains(eventKey + "item-amounts")){ + List eventItems = new LinkedList(); - if(Quests.checkList(data.getList(eventKey + "item-amounts"), Integer.class)){ - - List itemIds = new LinkedList(); - - for(Integer i : data.getIntegerList(eventKey + "item-ids")){ - Material m = Material.getMaterial(i); - if(m != null) - itemIds.add(m); - else{ - Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + i + ChatColor.GOLD + " inside " + ChatColor.GREEN + " item-ids: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a valid item id!"); - return null; - } - } - - List itemAmounts = data.getIntegerList(eventKey + "item-amounts"); - - for(Material m : itemIds) - event.items.put(m, itemAmounts.get(itemIds.indexOf(m))); - - }else{ - Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "item-amounts: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of numbers!"); + for (String s : data.getStringList(eventKey + "items")) { + try { + eventItems.add(ItemUtil.readItemStack(s)); + } catch (Exception e) { + Quests.printSevere(ChatColor.GOLD + "[Quests] \"" + ChatColor.RED + s + ChatColor.GOLD + "\" inside " + ChatColor.GREEN + " items: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not formatted properly!"); return null; } - - }else{ - Quests.printSevere(ChatColor.GOLD + "[Quests] Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is missing " + ChatColor.RED + "item-amounts:"); - return null; } - }else{ - Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "item-ids: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of item ids!"); + event.items.addAll(eventItems); + + } else { + Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "items: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of items!"); return null; } } - if(data.contains(eventKey + "storm-world")){ + if (data.contains(eventKey + "storm-world")) { World w = plugin.getServer().getWorld(data.getString(eventKey + "storm-world")); - if(w == null){ + if (w == null) { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "storm-world: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a valid World name!"); return null; } - if(data.contains(eventKey + "storm-duration")){ + if (data.contains(eventKey + "storm-duration")) { if (data.getInt(eventKey + "storm-duration", -999) != -999) { event.stormDuration = data.getInt(eventKey + "storm-duration"); @@ -404,23 +424,23 @@ public class Event { event.stormWorld = w; - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is missing " + ChatColor.RED + "storm-duration:"); return null; } } - if(data.contains(eventKey + "thunder-world")){ + if (data.contains(eventKey + "thunder-world")) { World w = plugin.getServer().getWorld(data.getString(eventKey + "thunder-world")); - if(w == null){ + if (w == null) { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "thunder-world: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a valid World name!"); return null; } - if(data.contains(eventKey + "thunder-duration")){ + if (data.contains(eventKey + "thunder-duration")) { if (data.getInt(eventKey + "thunder-duration", -999) != -999) { event.thunderDuration = data.getInt(eventKey + "thunder-duration"); @@ -431,40 +451,40 @@ public class Event { event.thunderWorld = w; - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is missing " + ChatColor.RED + "thunder-duration:"); return null; } } - if(data.contains(eventKey + "mob-spawn-locations")){ + if (data.contains(eventKey + "mob-spawn-locations")) { - if(Quests.checkList(data.getList(eventKey + "mob-spawn-locations"), String.class)){ + if (Quests.checkList(data.getList(eventKey + "mob-spawn-locations"), String.class)) { - if(data.contains(eventKey + "mob-spawn-types")){ + if (data.contains(eventKey + "mob-spawn-types")) { - if(Quests.checkList(data.getList(eventKey + "mob-spawn-types"), String.class)){ + if (Quests.checkList(data.getList(eventKey + "mob-spawn-types"), String.class)) { - if(data.contains(eventKey + "mob-spawn-amounts")){ + if (data.contains(eventKey + "mob-spawn-amounts")) { - if(Quests.checkList(data.getList(eventKey + "mob-spawn-amounts"), Integer.class)){ + if (Quests.checkList(data.getList(eventKey + "mob-spawn-amounts"), Integer.class)) { List mobLocs = data.getStringList(eventKey + "mob-spawn-locations"); List mobTypes = data.getStringList(eventKey + "mob-spawn-types"); List mobAmounts = data.getIntegerList(eventKey + "mob-spawn-amounts"); - for(String s : mobLocs){ + for (String s : mobLocs) { Location location = Quests.getLocation(s); - if(location == null){ + if (location == null) { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + s + ChatColor.GOLD + " inside " + ChatColor.GREEN + " mob-spawn-locations: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not in proper location format!"); Quests.printSevere(ChatColor.GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); return null; } EntityType type = Quests.getMobType(mobTypes.get(mobLocs.indexOf(s))); - if(type == null){ + if (type == null) { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + mobTypes.get(mobLocs.indexOf(s)) + ChatColor.GOLD + " inside " + ChatColor.GREEN + " mob-spawn-types: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a valid mob name!"); return null; } @@ -477,41 +497,41 @@ public class Event { } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "mob-spawn-amounts: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of numbers!"); return null; } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is missing " + ChatColor.RED + "mob-spawn-amounts:"); return null; } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "mob-spawn-types: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of mob names!"); return null; } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is missing " + ChatColor.RED + "mob-spawn-types:"); return null; } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "mob-spawn-locations: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of locations!"); return null; } } - if(data.contains(eventKey + "lightning-strikes")){ + if (data.contains(eventKey + "lightning-strikes")) { - if(Quests.checkList(data.getList(eventKey + "lightning-strikes"), String.class)){ + if (Quests.checkList(data.getList(eventKey + "lightning-strikes"), String.class)) { - for(String s : data.getStringList(eventKey + "lightning-strikes")){ + for (String s : data.getStringList(eventKey + "lightning-strikes")) { Location loc = Quests.getLocation(s); - if(loc == null){ + if (loc == null) { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + s + ChatColor.GOLD + " inside " + ChatColor.GREEN + " lightning-strikes: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not in proper location format!"); Quests.printSevere(ChatColor.GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); return null; @@ -520,33 +540,47 @@ public class Event { } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "lightning-strikes: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of locations!"); return null; } } - if(data.contains(eventKey + "potion-effect-types")){ + if (data.contains(eventKey + "commands")) { - if(Quests.checkList(data.getList(eventKey + "potion-effect-types"), String.class)){ + if (Quests.checkList(data.getList(eventKey + "commands"), String.class)) { + for(String s : data.getStringList(eventKey + "commands")){ + if(s.startsWith("/")) + s = s.replaceFirst("/", ""); + event.commands.add(s); + } + } else { + Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "commands: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of commands!"); + return null; + } + } - if(data.contains(eventKey + "potion-effect-durations")){ + if (data.contains(eventKey + "potion-effect-types")) { - if(Quests.checkList(data.getList(eventKey + "potion-effect-durations"), Integer.class)){ + if (Quests.checkList(data.getList(eventKey + "potion-effect-types"), String.class)) { - if(data.contains(eventKey + "potion-effect-amplifiers")){ + if (data.contains(eventKey + "potion-effect-durations")) { - if(Quests.checkList(data.getList(eventKey + "potion-effect-amplifiers"), Integer.class)){ + if (Quests.checkList(data.getList(eventKey + "potion-effect-durations"), Integer.class)) { + + if (data.contains(eventKey + "potion-effect-amplifiers")) { + + if (Quests.checkList(data.getList(eventKey + "potion-effect-amplifiers"), Integer.class)) { List types = data.getStringList(eventKey + "potion-effect-types"); List durations = data.getIntegerList(eventKey + "potion-effect-durations"); List amplifiers = data.getIntegerList(eventKey + "potion-effect-amplifiers"); - for(String s : types){ + for (String s : types) { PotionEffect effect = Quests.getPotionEffect(s, durations.get(types.indexOf(s)), amplifiers.get(types.indexOf(s))); - if(effect == null){ + if (effect == null) { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + s + ChatColor.GOLD + " inside " + ChatColor.GREEN + " lightning-strikes: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a valid potion effect name!"); return null; } @@ -554,27 +588,27 @@ public class Event { } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "potion-effect-amplifiers: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of numbers!"); return null; } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is missing " + ChatColor.RED + "potion-effect-amplifiers:"); return null; } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "potion-effect-durations: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of numbers!"); return null; } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is missing " + ChatColor.RED + "potion-effect-durations:"); return null; } - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "potion-effect-types: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a list of potion effects!"); return null; } @@ -582,7 +616,7 @@ public class Event { } - if(data.contains(eventKey + "hunger")){ + if (data.contains(eventKey + "hunger")) { if (data.getInt(eventKey + "hunger", -999) != -999) { event.hunger = data.getInt(eventKey + "hunger"); @@ -593,7 +627,7 @@ public class Event { } - if(data.contains(eventKey + "saturation")){ + if (data.contains(eventKey + "saturation")) { if (data.getInt(eventKey + "saturation", -999) != -999) { event.saturation = data.getInt(eventKey + "saturation"); @@ -604,7 +638,7 @@ public class Event { } - if(data.contains(eventKey + "health")){ + if (data.contains(eventKey + "health")) { if (data.getInt(eventKey + "health", -999) != -999) { event.health = data.getInt(eventKey + "health"); @@ -615,19 +649,19 @@ public class Event { } - if(data.contains(eventKey + "teleport-location")){ + if (data.contains(eventKey + "teleport-location")) { - if(data.isString(eventKey + "teleport-location")){ + if (data.isString(eventKey + "teleport-location")) { Location l = Quests.getLocation(data.getString(eventKey + "teleport-location")); - if(l == null){ + if (l == null) { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + data.getString(eventKey + "teleport-location") + ChatColor.GOLD + "for " + ChatColor.GREEN + " teleport-location: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not in proper location format!"); Quests.printSevere(ChatColor.GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); return null; } event.teleport = l; - }else{ + } else { Quests.printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "teleport-location: " + ChatColor.GOLD + "inside Event " + ChatColor.DARK_PURPLE + name + ChatColor.GOLD + " is not a location!"); return null; } @@ -637,5 +671,4 @@ public class Event { return event; } - } diff --git a/src/me/blackvein/quests/EventFactory.java b/src/me/blackvein/quests/EventFactory.java index c47a6cd9a..ba0fb33a1 100644 --- a/src/me/blackvein/quests/EventFactory.java +++ b/src/me/blackvein/quests/EventFactory.java @@ -1,26 +1,30 @@ package me.blackvein.quests; import java.io.File; +import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import me.blackvein.quests.prompts.ItemStackPrompt; +import me.blackvein.quests.util.ItemUtil; +import me.blackvein.quests.util.Lang; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.Effect; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.conversations.*; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -public class EventFactory implements ConversationAbandonedListener { +public class EventFactory implements ConversationAbandonedListener, ColorUtil{ Quests quests; Map editSessions = new HashMap(); @@ -31,19 +35,6 @@ public class EventFactory implements ConversationAbandonedListener { Map selectedTeleportLocations = new HashMap(); List names = new LinkedList(); ConversationFactory convoCreator; - static final ChatColor BOLD = ChatColor.BOLD; - static final ChatColor AQUA = ChatColor.AQUA; - static final ChatColor DARKAQUA = ChatColor.DARK_AQUA; - static final ChatColor BLUE = ChatColor.BLUE; - static final ChatColor GOLD = ChatColor.GOLD; - static final ChatColor GRAY = ChatColor.GRAY; - static final ChatColor PINK = ChatColor.LIGHT_PURPLE; - static final ChatColor PURPLE = ChatColor.DARK_PURPLE; - static final ChatColor GREEN = ChatColor.GREEN; - static final ChatColor RED = ChatColor.RED; - static final ChatColor DARKRED = ChatColor.DARK_RED; - static final ChatColor YELLOW = ChatColor.YELLOW; - static final ChatColor RESET = ChatColor.RESET; File eventsFile; @SuppressWarnings("LeakingThisInConstructor") @@ -97,11 +88,11 @@ public class EventFactory implements ConversationAbandonedListener { public String getPromptText(ConversationContext context) { String text = - GOLD + "- Event Editor -\n" - + BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Create an Event\n" - + BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Edit an Event\n" - + BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Delete an Event\n" - + GREEN + "" + BOLD + "4" + RESET + YELLOW + " - Exit"; + GOLD + "- " + Lang.get("eventEditorTitle") + " -\n" + + BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorCreate") + "\n" + + BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorEdit") + "\n" + + BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("eventEditorDelete") + "\n" + + GREEN + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("exit"); return text; @@ -110,25 +101,56 @@ public class EventFactory implements ConversationAbandonedListener { @Override protected Prompt acceptValidatedInput(ConversationContext context, String input) { + final Player player = (Player) context.getForWhom(); + if (input.equalsIgnoreCase("1")) { - context.setSessionData("oldEvent", ""); - return new EventNamePrompt(); - }else if(input.equalsIgnoreCase("2")){ - if(quests.events.isEmpty()){ - ((Player)context.getForWhom()).sendMessage(YELLOW + "No Events currently exist to be edited!"); - return new MenuPrompt(); + + + if(player.hasPermission("quests.editor.events.create")){ + context.setSessionData("oldEvent", ""); + return new EventNamePrompt(); }else{ - return new SelectEditPrompt(); + player.sendMessage(RED + "You do not have permission to create new Events."); + return new MenuPrompt(); + } + + }else if(input.equalsIgnoreCase("2")){ + + if(player.hasPermission("quests.editor.events.edit")){ + + if(quests.events.isEmpty()){ + ((Player)context.getForWhom()).sendMessage(YELLOW + Lang.get("eventEditorNoneToEdit")); + return new MenuPrompt(); + }else{ + return new SelectEditPrompt(); + } + + }else{ + + player.sendMessage(RED + "You do not have permission to edit Events."); + return new MenuPrompt(); + } }else if(input.equalsIgnoreCase("3")){ - if(quests.events.isEmpty()){ - ((Player)context.getForWhom()).sendMessage(YELLOW + "No Events currently exist to be deleted!"); - return new MenuPrompt(); + + if(player.hasPermission("quests.editor.events.delete")){ + + if(quests.events.isEmpty()){ + ((Player)context.getForWhom()).sendMessage(YELLOW + Lang.get("eventEditorNoneToDelete")); + return new MenuPrompt(); + }else{ + return new SelectDeletePrompt(); + } + }else{ - return new SelectDeletePrompt(); + + player.sendMessage(RED + "You do not have permission to delete Events."); + return new MenuPrompt(); + } + }else if(input.equalsIgnoreCase("4")){ - ((Player)context.getForWhom()).sendMessage(YELLOW + "Exited."); + ((Player)context.getForWhom()).sendMessage(YELLOW + Lang.get("exited")); return Prompt.END_OF_CONVERSATION; } @@ -169,6 +191,7 @@ public class EventFactory implements ConversationAbandonedListener { context.setSessionData("evtSaturation", null); context.setSessionData("evtHealth", null); context.setSessionData("evtTeleportLocation", null); + context.setSessionData("evtCommands", null); } @@ -184,15 +207,10 @@ public class EventFactory implements ConversationAbandonedListener { if(event.items != null && event.items.isEmpty() == false){ - LinkedList ids = new LinkedList(); - LinkedList amounts = new LinkedList(); - for(Entry e : event.items.entrySet()){ - ids.add(((Material)e.getKey()).getId()); - amounts.add((Integer)e.getValue()); - } + LinkedList items = new LinkedList(); + items.addAll(event.items); - context.setSessionData("evtItemIds", ids); - context.setSessionData("evtItemAmounts", amounts); + context.setSessionData("evtItems", items); } @@ -311,6 +329,12 @@ public class EventFactory implements ConversationAbandonedListener { } + if(event.commands != null){ + + context.setSessionData("evtCommands", event.commands); + + } + } private class SelectEditPrompt extends StringPrompt { @@ -318,13 +342,13 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String text = GOLD + "- Edit an Event -\n"; + String text = GOLD + "- " + Lang.get("eventEditorEdit") + " -\n"; for(Event evt : quests.events) - text += AQUA + evt.name + YELLOW + ","; + text += AQUA + evt.name + YELLOW + ", "; - text = text.substring(0, text.length() - 1) + "\n"; - text += YELLOW + "Enter an Event name, or \"cancel\" to return."; + text = text.substring(0, text.length() - 2) + "\n"; + text += YELLOW + Lang.get("eventEditorEnterEventName"); return text; @@ -333,7 +357,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public Prompt acceptInput(ConversationContext context, String input) { - if(input.equalsIgnoreCase("cancel") == false){ + if(input.equalsIgnoreCase(Lang.get("cmdCancel")) == false){ for(Event evt : quests.events){ @@ -346,7 +370,7 @@ public class EventFactory implements ConversationAbandonedListener { } - ((Player)context.getForWhom()).sendMessage(RED + "Event not found!"); + ((Player)context.getForWhom()).sendMessage(RED + Lang.get("eventEditorNotFound")); return new SelectEditPrompt(); }else{ @@ -362,13 +386,13 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String text = GOLD + "- Delete an Event -\n"; + String text = GOLD + "- " + Lang.get("eventEditorDelete") + " -\n"; for(Event evt : quests.events) text += AQUA + evt.name + YELLOW + ","; text = text.substring(0, text.length() - 1) + "\n"; - text += YELLOW + "Enter an Event name, or \"cancel\" to return."; + text += YELLOW + Lang.get("eventEditorEnterEventName"); return text; @@ -377,7 +401,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public Prompt acceptInput(ConversationContext context, String input) { - if(input.equalsIgnoreCase("cancel") == false){ + if(input.equalsIgnoreCase(Lang.get("cmdCancel")) == false){ LinkedList used = new LinkedList(); @@ -402,18 +426,18 @@ public class EventFactory implements ConversationAbandonedListener { context.setSessionData("delEvent", evt.name); return new DeletePrompt(); }else{ - ((Player)context.getForWhom()).sendMessage(RED + "The following Quests use the Event \"" + PURPLE + evt.name + RED + "\""); + ((Player)context.getForWhom()).sendMessage(RED + Lang.get("eventEditorEventInUse") + " \"" + PURPLE + evt.name + RED + "\":"); for(String s : used){ ((Player)context.getForWhom()).sendMessage(RED + "- " + DARKRED + s); } - ((Player)context.getForWhom()).sendMessage(RED + "You must modify these Quests so that they do not use the Event before deleting it."); + ((Player)context.getForWhom()).sendMessage(RED + Lang.get("eventEditorMustModifyQuests")); return new SelectDeletePrompt(); } } } - ((Player)context.getForWhom()).sendMessage(RED + "Event not found!"); + ((Player)context.getForWhom()).sendMessage(RED + Lang.get("eventEditorNotFound")); return new SelectDeletePrompt(); }else{ @@ -430,8 +454,8 @@ public class EventFactory implements ConversationAbandonedListener { public String getPromptText(ConversationContext context) { String text = - RED + "Are you sure you want to delete the Event \"" + GOLD + (String)context.getSessionData("delEvent") + RED + "\"?\n"; - text += YELLOW + "Yes/No"; + RED + Lang.get("eventEditorDeletePrompt") + " \"" + GOLD + (String)context.getSessionData("delEvent") + RED + "\"?\n"; + text += YELLOW + Lang.get("yes") + "/" + Lang.get("no"); return text; @@ -440,10 +464,10 @@ public class EventFactory implements ConversationAbandonedListener { @Override public Prompt acceptInput(ConversationContext context, String input) { - if(input.equalsIgnoreCase("Yes")){ + if(input.equalsIgnoreCase(Lang.get("yes"))){ deleteEvent(context); return new MenuPrompt(); - }else if(input.equalsIgnoreCase("No")){ + }else if(input.equalsIgnoreCase(Lang.get("no"))){ return new MenuPrompt(); }else { return new DeletePrompt(); @@ -457,7 +481,7 @@ public class EventFactory implements ConversationAbandonedListener { public CreateMenuPrompt() { - super("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17"); + super("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"); } @@ -465,43 +489,42 @@ public class EventFactory implements ConversationAbandonedListener { public String getPromptText(ConversationContext context) { String text = - GOLD + "- Event: " + AQUA + context.getSessionData("evtName") + GOLD + " -\n"; + GOLD + "- " + Lang.get("event") + ": " + AQUA + context.getSessionData("evtName") + GOLD + " -\n"; - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set name\n"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorSetName") + "\n"; if (context.getSessionData("evtMessage") == null) { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set message " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorSetMessage") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set message (" + AQUA + "\"" + context.getSessionData("evtMessage") + "\"" + YELLOW + ")\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorSetMessage") + "(" + AQUA + "\"" + context.getSessionData("evtMessage") + "\"" + YELLOW + ")\n"; } if (context.getSessionData("evtClearInv") == null) { context.setSessionData("evtClearInv", "No"); } - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear player inventory: " + AQUA + context.getSessionData("evtClearInv") + "\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("eventEditorClearInv") + ": " + AQUA + context.getSessionData("evtClearInv") + "\n"; - if (context.getSessionData("evtItemIds") == null) { - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set items " + GRAY + "(None set)\n"; + if (context.getSessionData("evtItems") == null) { + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("eventEditorSetItems") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set items\n"; - LinkedList ids = (LinkedList) context.getSessionData("evtItemIds"); - LinkedList amounts = (LinkedList) context.getSessionData("evtItemAmounts"); + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("eventEditorSetItems") + "\n"; + LinkedList items = (LinkedList) context.getSessionData("evtItems"); - for (int i : ids) { + for (ItemStack is : items) { - text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + YELLOW + " x " + AQUA + amounts.get(ids.indexOf(i)) + "\n"; + text += GRAY + " - " + ItemUtil.getString(is) + "\n"; } } if (context.getSessionData("evtExplosions") == null) { - text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set explosion locations " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - " + Lang.get("eventEditorSetExplosions") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set explosion locations\n"; + text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - " + Lang.get("eventEditorSetExplosions") + "\n"; LinkedList locations = (LinkedList) context.getSessionData("evtExplosions"); for (String loc : locations) { @@ -513,10 +536,10 @@ public class EventFactory implements ConversationAbandonedListener { } if (context.getSessionData("evtEffects") == null) { - text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - Set effects " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - " + Lang.get("eventEditorSetEffects") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - Set effects\n"; + text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - " + Lang.get("eventEditorSetEffects") + "\n"; LinkedList effects = (LinkedList) context.getSessionData("evtEffects"); LinkedList locations = (LinkedList) context.getSessionData("evtEffectLocations"); @@ -529,39 +552,39 @@ public class EventFactory implements ConversationAbandonedListener { } if (context.getSessionData("evtStormWorld") == null) { - text += BLUE + "" + BOLD + "7" + RESET + YELLOW + " - Set storm " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "7" + RESET + YELLOW + " - " + Lang.get("eventEditorSetStorm") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "7" + RESET + YELLOW + " - Set storm (" + AQUA + (String) context.getSessionData("evtStormWorld") + YELLOW + " for " + DARKAQUA + Quests.getTime((Long) context.getSessionData("evtStormDuration")) + YELLOW + ")\n"; + text += BLUE + "" + BOLD + "7" + RESET + YELLOW + " - " + Lang.get("eventEditorSetStorm") + " (" + AQUA + (String) context.getSessionData("evtStormWorld") + YELLOW + " -> " + DARKAQUA + Quests.getTime((Long) context.getSessionData("evtStormDuration")) + YELLOW + ")\n"; } if (context.getSessionData("evtThunderWorld") == null) { - text += BLUE + "" + BOLD + "8" + RESET + YELLOW + " - Set thunder " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "8" + RESET + YELLOW + " - " + Lang.get("eventEditorSetThunder") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "8" + RESET + YELLOW + " - Set thunder (" + AQUA + (String) context.getSessionData("evtThunderWorld") + YELLOW + " for " + DARKAQUA + Quests.getTime((Long) context.getSessionData("evtThunderDuration")) + YELLOW + ")\n"; + text += BLUE + "" + BOLD + "8" + RESET + YELLOW + " - " + Lang.get("eventEditorSetThunder") + " (" + AQUA + (String) context.getSessionData("evtThunderWorld") + YELLOW + " -> " + DARKAQUA + Quests.getTime((Long) context.getSessionData("evtThunderDuration")) + YELLOW + ")\n"; } if (context.getSessionData("evtMobTypes") == null) { - text += BLUE + "" + BOLD + "9" + RESET + YELLOW + " - Set mob spawns " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "9" + RESET + YELLOW + " - " + Lang.get("eventEditorSetMobSpawns") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { LinkedList types = (LinkedList) context.getSessionData("evtMobTypes"); LinkedList amounts = (LinkedList) context.getSessionData("evtMobAmounts"); LinkedList locations = (LinkedList) context.getSessionData("evtMobLocations"); - text += BLUE + "" + BOLD + "9" + RESET + YELLOW + " - Set mob spawns\n"; + text += BLUE + "" + BOLD + "9" + RESET + YELLOW + " - " + Lang.get("eventEditorSetMobSpawns") + "\n"; for (String s : types) { int amt = amounts.get(types.indexOf(s)); String loc = locations.get(types.indexOf(s)); - text += GRAY + " - " + AQUA + s + GRAY + " x " + DARKAQUA + amt + GRAY + " at " + GREEN + loc + "\n"; + text += GRAY + " - " + AQUA + s + GRAY + " x " + DARKAQUA + amt + GRAY + " -> " + GREEN + loc + "\n"; } } if (context.getSessionData("evtLightningStrikes") == null) { - text += BLUE + "" + BOLD + "10" + RESET + YELLOW + " - Set lightning strike locations " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "10" + RESET + YELLOW + " - " + Lang.get("eventEditorSetLightning") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "10" + RESET + YELLOW + " - Set lightning strike locations\n"; + text += BLUE + "" + BOLD + "10" + RESET + YELLOW + " - " + Lang.get("eventEditorSetLightning") + "\n"; LinkedList locations = (LinkedList) context.getSessionData("evtLightningStrikes"); for (String loc : locations) { @@ -573,10 +596,10 @@ public class EventFactory implements ConversationAbandonedListener { } if (context.getSessionData("evtPotionTypes") == null) { - text += BLUE + "" + BOLD + "11" + RESET + YELLOW + " - Set potion effects " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "11" + RESET + YELLOW + " - " + Lang.get("eventEditorSetPotionEffects") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "11" + RESET + YELLOW + " - Set potion effects\n"; + text += BLUE + "" + BOLD + "11" + RESET + YELLOW + " - " + Lang.get("eventEditorSetPotionEffects") + "\n"; LinkedList types = (LinkedList) context.getSessionData("evtPotionTypes"); LinkedList durations = (LinkedList) context.getSessionData("evtPotionDurations"); LinkedList mags = (LinkedList) context.getSessionData("evtPotionMagnitudes"); @@ -585,46 +608,56 @@ public class EventFactory implements ConversationAbandonedListener { for (String type : types) { index++; - text += GRAY + " - " + AQUA + type + PURPLE + " " + Quests.getNumeral(mags.get(index)) + GRAY + " for " + DARKAQUA + Quests.getTime(durations.get(index)*50L) + "\n"; + text += GRAY + " - " + AQUA + type + PURPLE + " " + Quests.getNumeral(mags.get(index)) + GRAY + " -> " + DARKAQUA + Quests.getTime(durations.get(index)*50L) + "\n"; } } if(context.getSessionData("evtHunger") == null) { - text += BLUE + "" + BOLD + "12" + RESET + YELLOW + " - Set player hunger level " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "12" + RESET + YELLOW + " - " + Lang.get("eventEditorSetHunger") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "12" + RESET + YELLOW + " - Set player hunger level " + AQUA + "(" + (Integer)context.getSessionData("evtHunger") + ")\n"; + text += BLUE + "" + BOLD + "12" + RESET + YELLOW + " - " + Lang.get("eventEditorSetHunger") + AQUA + " (" + (Integer)context.getSessionData("evtHunger") + ")\n"; } if(context.getSessionData("evtSaturation") == null) { - text += BLUE + "" + BOLD + "13" + RESET + YELLOW + " - Set player saturation level " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "13" + RESET + YELLOW + " - " + Lang.get("eventEditorSetSaturation") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "13" + RESET + YELLOW + " - Set player saturation level " + AQUA + "(" + (Integer)context.getSessionData("evtSaturation") + ")\n"; + text += BLUE + "" + BOLD + "13" + RESET + YELLOW + " - " + Lang.get("eventEditorSetSaturation") + AQUA + " (" + (Integer)context.getSessionData("evtSaturation") + ")\n"; } if(context.getSessionData("evtHealth") == null) { - text += BLUE + "" + BOLD + "14" + RESET + YELLOW + " - Set player health level " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "14" + RESET + YELLOW + " - " + Lang.get("eventEditorSetHealth") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "14" + RESET + YELLOW + " - Set player health level " + AQUA + "(" + (Integer)context.getSessionData("evtHealth") + ")\n"; + text += BLUE + "" + BOLD + "14" + RESET + YELLOW + " - " + Lang.get("eventEditorSetHealth") + AQUA + " (" + (Integer)context.getSessionData("evtHealth") + ")\n"; } if(context.getSessionData("evtTeleportLocation") == null) { - text += BLUE + "" + BOLD + "15" + RESET + YELLOW + " - Set player teleport location " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "15" + RESET + YELLOW + " - " + Lang.get("eventEditorSetTeleport") + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "15" + RESET + YELLOW + " - Set player teleport location " + AQUA + "(" + (String)context.getSessionData("evtTeleportLocation") + ")\n"; + text += BLUE + "" + BOLD + "15" + RESET + YELLOW + " - " + Lang.get("eventEditorSetTeleport") + AQUA + " (" + (String)context.getSessionData("evtTeleportLocation") + ")\n"; } - text += GREEN + "" + BOLD + "16" + RESET + YELLOW + " - Done\n"; - text += RED + "" + BOLD + "17" + RESET + YELLOW + " - Quit"; + if(context.getSessionData("evtCommands") == null) { + text += BLUE + "" + BOLD + "16" + RESET + YELLOW + " - " + Lang.get("eventEditorSetCommands") + GRAY + " (" + Lang.get("noneSet") + ")\n"; + } else { + + text += BLUE + "" + BOLD + "16" + RESET + YELLOW + " - " + Lang.get("eventEditorSetCommands") + "\n"; + for(String s : (LinkedList)context.getSessionData("evtCommands")) + text += GRAY + " - " + AQUA + s + "\n"; + + } + + text += GREEN + "" + BOLD + "17" + RESET + YELLOW + " - " + Lang.get("done") + "\n"; + text += RED + "" + BOLD + "18" + RESET + YELLOW + " - " + Lang.get("quit"); return text; @@ -705,13 +738,17 @@ public class EventFactory implements ConversationAbandonedListener { } else if (input.equalsIgnoreCase("16")) { + return new CommandsPrompt(); + + } else if (input.equalsIgnoreCase("17")) { + if(context.getSessionData("oldEvent") != null){ return new FinishPrompt((String)context.getSessionData("oldEvent")); }else{ return new FinishPrompt(null); } - } else if (input.equalsIgnoreCase("17")) { + } else if (input.equalsIgnoreCase("18")) { return new QuitPrompt(); @@ -728,8 +765,8 @@ public class EventFactory implements ConversationAbandonedListener { public String getPromptText(ConversationContext context) { String text = - GREEN + "Are you sure you want to quit without saving?\n"; - text += YELLOW + "Yes/No"; + GREEN + Lang.get("eventEditorQuitWithoutSaving") + "\n"; + text += YELLOW + Lang.get("yes") + "/" + Lang.get("no"); return text; @@ -738,13 +775,13 @@ public class EventFactory implements ConversationAbandonedListener { @Override public Prompt acceptInput(ConversationContext context, String input) { - if(input.equalsIgnoreCase("Yes")){ + if(input.equalsIgnoreCase(Lang.get("yes"))){ clearData(context); return new MenuPrompt(); - }else if(input.equalsIgnoreCase("No")){ + }else if(input.equalsIgnoreCase(Lang.get("no"))){ return new CreateMenuPrompt(); }else{ - ((Player) context.getForWhom()).sendMessage(RED + "Invalid option!"); + ((Player) context.getForWhom()).sendMessage(RED + Lang.get("invalidOption")); return new QuitPrompt(); } @@ -787,15 +824,14 @@ public class EventFactory implements ConversationAbandonedListener { public String getPromptText(ConversationContext context) { String text = - RED + "Are you sure you want to finish and save the Event \"" + GOLD + (String)context.getSessionData("evtName") + GREEN + "\"?\n"; + RED + Lang.get("eventEditorFinishAndSave") + " \"" + GOLD + (String)context.getSessionData("evtName") + RED + "\"?\n"; if(modified.isEmpty() == false){ - text += RED + "Note: You have modified an Event that the following Quests use:\n"; + text += RED + Lang.get("eventEditorModifiedNote") + "\n"; for(String s : modified) text += GRAY + " - " + DARKRED + s + "\n"; - text += RED + "If you save the Event, anyone who is actively doing any of these Quests\n"; - text += RED + "will be forced to quit them.\n"; + text += RED + Lang.get("eventEditorForcedToQuit") + "\n"; } - text += YELLOW + "Yes/No"; + text += YELLOW + Lang.get("yes") + "/" + Lang.get("no"); return text; @@ -804,13 +840,13 @@ public class EventFactory implements ConversationAbandonedListener { @Override public Prompt acceptInput(ConversationContext context, String input) { - if(input.equalsIgnoreCase("Yes")){ + if(input.equalsIgnoreCase(Lang.get("yes"))){ saveEvent(context); return new MenuPrompt(); - }else if(input.equalsIgnoreCase("No")){ + }else if(input.equalsIgnoreCase(Lang.get("no"))){ return new CreateMenuPrompt(); }else{ - ((Player) context.getForWhom()).sendMessage(RED + "Invalid option!"); + ((Player) context.getForWhom()).sendMessage(RED + Lang.get("invalidOption")); return new FinishPrompt(modName); } @@ -861,7 +897,7 @@ public class EventFactory implements ConversationAbandonedListener { data.load(eventsFile); }catch(Exception e){ e.printStackTrace(); - ((Player)context.getForWhom()).sendMessage(ChatColor.RED + "Error reading Events file."); + ((Player)context.getForWhom()).sendMessage(ChatColor.RED + Lang.get("eventEditorErrorReadingFile")); return; } @@ -872,14 +908,14 @@ public class EventFactory implements ConversationAbandonedListener { try{ data.save(eventsFile); }catch (Exception e){ - ((Player)context.getForWhom()).sendMessage(ChatColor.RED + "An error occurred while saving."); + ((Player)context.getForWhom()).sendMessage(ChatColor.RED + Lang.get("eventEditorErrorSaving")); return; } quests.reloadQuests(); - ((Player)context.getForWhom()).sendMessage(ChatColor.YELLOW + "Event deleted, Quests and Events reloaded."); + ((Player)context.getForWhom()).sendMessage(ChatColor.YELLOW + Lang.get("eventEditorDeleted")); for(Quester q : quests.questers.values()) q.checkQuest(); @@ -897,7 +933,7 @@ public class EventFactory implements ConversationAbandonedListener { data.load(eventsFile); }catch(Exception e){ e.printStackTrace(); - ((Player)context.getForWhom()).sendMessage(ChatColor.RED + "Error reading Events file."); + ((Player)context.getForWhom()).sendMessage(ChatColor.RED + Lang.get("eventEditorErrorReadingFile")); return; } @@ -919,13 +955,15 @@ public class EventFactory implements ConversationAbandonedListener { context.setSessionData("clear-inventory", "true"); } - if (context.getSessionData("evtItemIds") != null) { + if (context.getSessionData("evtItems") != null) { - LinkedList ids = getCIntList(context, "evtItemIds"); - LinkedList amounts = getCIntList(context, "evtItemAmounts"); - - section.set("item-ids", ids); - section.set("item-amounts", amounts); + LinkedList items = (LinkedList) context.getSessionData("evtItems"); + LinkedList lines = new LinkedList(); + + for(ItemStack is : items) + lines.add(ItemUtil.serialize(is)); + + section.set("items", lines); } @@ -985,6 +1023,13 @@ public class EventFactory implements ConversationAbandonedListener { } + if (context.getSessionData("evtCommands") != null) { + + LinkedList commands = getCStringList(context, "evtCommands"); + section.set("commands", commands); + + } + if (context.getSessionData("evtPotionTypes") != null) { LinkedList types = getCStringList(context, "evtPotionTypes"); @@ -1027,14 +1072,14 @@ public class EventFactory implements ConversationAbandonedListener { try{ data.save(eventsFile); }catch (Exception e){ - ((Player)context.getForWhom()).sendMessage(ChatColor.RED + "An error occurred while saving."); + ((Player)context.getForWhom()).sendMessage(ChatColor.RED + Lang.get("eventEditorErrorSaving")); return; } quests.reloadQuests(); - ((Player)context.getForWhom()).sendMessage(ChatColor.YELLOW + "Event saved, Quests and Events reloaded."); + ((Player)context.getForWhom()).sendMessage(ChatColor.YELLOW + Lang.get("eventEditorSaved")); for(Quester q : quests.questers.values()) q.checkQuest(); @@ -1049,7 +1094,7 @@ public class EventFactory implements ConversationAbandonedListener { public String getPromptText(ConversationContext context) { String text = - AQUA + "Create new Event " + GOLD + "- Enter a name for the Event (Or enter \'cancel\' to return to the main menu)"; + AQUA + Lang.get("eventEditorCreate") + GOLD + " - " + Lang.get("eventEditorEnterEventName"); return text; @@ -1058,13 +1103,13 @@ public class EventFactory implements ConversationAbandonedListener { @Override public Prompt acceptInput(ConversationContext context, String input) { - if (input.equalsIgnoreCase("cancel") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { for (Event e : quests.events) { if (e.name.equalsIgnoreCase(input)) { - context.getForWhom().sendRawMessage(RED + "Event already exists!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorExists")); return new EventNamePrompt(); } @@ -1073,14 +1118,14 @@ public class EventFactory implements ConversationAbandonedListener { if (names.contains(input)) { - context.getForWhom().sendRawMessage(RED + "Someone is creating/editing an Event with that name!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorSomeone")); return new EventNamePrompt(); } if (StringUtils.isAlphanumeric(input) == false) { - context.getForWhom().sendRawMessage(RED + "Name must be alphanumeric!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorAlpha")); return new EventNamePrompt(); } @@ -1103,7 +1148,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter NPC ID (or -1 to return)"; + return YELLOW + Lang.get("eventEditorEnterNPCId"); } @@ -1113,7 +1158,7 @@ public class EventFactory implements ConversationAbandonedListener { if (input.intValue() != -1) { if (quests.citizens.getNPCRegistry().getById(input.intValue()) == null) { - context.getForWhom().sendRawMessage(RED + "No NPC exists with that id!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorNoNPCExists")); return new SetNpcStartPrompt(); } @@ -1131,7 +1176,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Right-click on a block to spawn an explosion at, then enter \"add\" to add it to the list,\nor enter \"clear\" to clear the explosions list, or \"cancel\" to return"; + return YELLOW + Lang.get("eventEditorExplosionPrompt"); } @@ -1140,7 +1185,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("add")) { + if (input.equalsIgnoreCase(Lang.get("cmdAdd"))) { Block block = selectedExplosionLocations.get(player); if (block != null) { @@ -1159,19 +1204,19 @@ public class EventFactory implements ConversationAbandonedListener { selectedExplosionLocations.remove(player); } else { - player.sendMessage(RED + "You must select a block first."); + player.sendMessage(RED + Lang.get("eventEditorSelectBlockFirst")); return new ExplosionPrompt(); } return new CreateMenuPrompt(); - } else if (input.equalsIgnoreCase("clear")) { + } else if (input.equalsIgnoreCase(Lang.get("cmdClear"))) { context.setSessionData("evtExplosions", null); selectedExplosionLocations.remove(player); return new CreateMenuPrompt(); - } else if (input.equalsIgnoreCase("cancel")) { + } else if (input.equalsIgnoreCase(Lang.get("cmdCancel"))) { selectedExplosionLocations.remove(player); return new CreateMenuPrompt(); @@ -1188,32 +1233,32 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter Quest name (or \'cancel\' to return)"; + return YELLOW + Lang.get("eventEditorEnterEventName"); } @Override public Prompt acceptInput(ConversationContext context, String input) { - if (input.equalsIgnoreCase("cancel") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { for (Event e : quests.events) { if (e.name.equalsIgnoreCase(input)) { - context.getForWhom().sendRawMessage(RED + "An Event with that name already exists!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorExists")); return new SetNamePrompt(); } } if (names.contains(input)) { - context.getForWhom().sendRawMessage(RED + "Someone is creating/editing an Event with that name!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorSomeone")); return new SetNamePrompt(); } if (StringUtils.isAlphanumeric(input) == false) { - context.getForWhom().sendRawMessage(RED + "Name must be alphanumeric!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorAlpha")); return new SetNamePrompt(); } @@ -1234,16 +1279,16 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter message, or enter \'none\' to delete, or \'cancel\' to return)"; + return YELLOW + Lang.get("eventEditorSetMessagePrompt"); } @Override public Prompt acceptInput(ConversationContext context, String input) { - if (input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("none") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false && input.equalsIgnoreCase("cmdNone") == false) { context.setSessionData("evtMessage", input); - } else if (input.equalsIgnoreCase("none")) { + } else if (input.equalsIgnoreCase(Lang.get("cmdNone"))) { context.setSessionData("evtMessage", null); } @@ -1254,45 +1299,49 @@ public class EventFactory implements ConversationAbandonedListener { private class ItemListPrompt extends FixedSetPrompt { - public ItemListPrompt() { + public ItemListPrompt(){ - super("1", "2", "3", "4"); + super("1", "2", "3"); } @Override - public String getPromptText(ConversationContext context) { - - String text = GOLD + "- Event Items -\n"; - if (context.getSessionData("evtItemIds") == null) { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs (None set)\n"; - text += GRAY + "2 - Set item amounts (No IDs set)\n"; - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; - } else { - - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs\n"; - for (Integer i : getItemIds(context)) { - - text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + "\n"; + public String getPromptText(ConversationContext context){ + // Check/add newly made item + if(context.getSessionData("newItem") != null){ + if(context.getSessionData("evtItems") != null){ + List items = getItems(context); + items.add((ItemStack) context.getSessionData("tempStack")); + context.setSessionData("evtItems", items); + }else{ + LinkedList itemRews = new LinkedList(); + itemRews.add((ItemStack) context.getSessionData("tempStack")); + context.setSessionData("evtItems", itemRews); } - if (context.getSessionData("evtItemAmounts") == null) { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts (None set)\n"; - } else { + context.setSessionData("newItem", null); + context.setSessionData("tempStack", null); - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts\n"; - for (Integer i : getItemAmounts(context)) { + } + + String text = GOLD + "- Give Items -\n"; + if(context.getSessionData("evtItems") == null){ + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Add item\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Clear\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Done"; + }else{ - text += GRAY + " - " + AQUA + i + "\n"; + for(ItemStack is : getItems(context)){ - } + text += GRAY + " - " + ItemUtil.getDisplayString(is) + "\n"; } + + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Add item\n"; - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Clear\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Done"; } @@ -1301,146 +1350,25 @@ public class EventFactory implements ConversationAbandonedListener { } @Override - protected Prompt acceptValidatedInput(ConversationContext context, String input) { + protected Prompt acceptValidatedInput(ConversationContext context, String input){ - if (input.equalsIgnoreCase("1")) { - return new ItemIdsPrompt(); - } else if (input.equalsIgnoreCase("2")) { - if (context.getSessionData("evtItemIds") == null) { - context.getForWhom().sendRawMessage(RED + "You must set item IDs first!"); - return new ItemListPrompt(); - } else { - return new ItemAmountsPrompt(); - } - } else if (input.equalsIgnoreCase("3")) { - context.getForWhom().sendRawMessage(YELLOW + "Event items cleared."); - context.setSessionData("evtItemIds", null); - context.setSessionData("evtItemAmounts", null); + if(input.equalsIgnoreCase("1")){ + return new ItemStackPrompt(ItemListPrompt.this); + }else if(input.equalsIgnoreCase("2")){ + context.getForWhom().sendRawMessage(YELLOW + "Event Items cleared."); + context.setSessionData("evtItems", null); return new ItemListPrompt(); - } else if (input.equalsIgnoreCase("4")) { - - int one; - int two; - - if (context.getSessionData("evtItemIds") != null) { - one = ((List) context.getSessionData("evtItemIds")).size(); - } else { - one = 0; - } - - if (context.getSessionData("evtItemAmounts") != null) { - two = ((List) context.getSessionData("evtItemAmounts")).size(); - } else { - two = 0; - } - - if (one == two) { - return new CreateMenuPrompt(); - } else { - context.getForWhom().sendRawMessage(RED + "The " + GOLD + "item IDs list " + RED + "and " + GOLD + "item amounts list " + RED + "are not the same size!"); - return new ItemListPrompt(); - } + }else if(input.equalsIgnoreCase("3")){ + return new CreateMenuPrompt(); } return null; } - private List getItemIds(ConversationContext context) { - return (List) context.getSessionData("evtItemIds"); + private List getItems(ConversationContext context){ + return (List) context.getSessionData("evtItems"); } - private List getItemAmounts(ConversationContext context) { - return (List) context.getSessionData("evtItemAmounts"); - } - } - - private class ItemIdsPrompt extends StringPrompt { - - @Override - public String getPromptText(ConversationContext context) { - return YELLOW + "Enter item IDs separating each one by a space, or enter \'cancel\' to return."; - } - - @Override - public Prompt acceptInput(ConversationContext context, String input) { - - if (input.equalsIgnoreCase("cancel") == false) { - - String[] args = input.split(" "); - LinkedList ids = new LinkedList(); - for (String s : args) { - - try { - - if (Material.getMaterial(Integer.parseInt(s)) != null) { - - if (ids.contains(Integer.parseInt(s)) == false) { - ids.add(Integer.parseInt(s)); - } else { - context.getForWhom().sendRawMessage(RED + "List contains duplicates!"); - return new ItemIdsPrompt(); - } - - } else { - context.getForWhom().sendRawMessage(PINK + s + RED + " is not a valid item ID!"); - return new ItemIdsPrompt(); - } - - } catch (Exception e) { - context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!"); - return new ItemIdsPrompt(); - } - - } - - context.setSessionData("evtItemIds", ids); - - } - - return new ItemListPrompt(); - - } - } - - private class ItemAmountsPrompt extends StringPrompt { - - @Override - public String getPromptText(ConversationContext context) { - return YELLOW + "Enter item amounts (numbers) separating each one by a space, or enter \'cancel\' to return."; - } - - @Override - public Prompt acceptInput(ConversationContext context, String input) { - - if (input.equalsIgnoreCase("cancel") == false) { - - String[] args = input.split(" "); - LinkedList amounts = new LinkedList(); - for (String s : args) { - - try { - - if (Integer.parseInt(s) > 0) { - amounts.add(Integer.parseInt(s)); - } else { - context.getForWhom().sendRawMessage(PINK + s + RED + " is not greater than 0!"); - return new ItemAmountsPrompt(); - } - - } catch (Exception e) { - context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!"); - return new ItemAmountsPrompt(); - } - - } - - context.setSessionData("evtItemAmounts", amounts); - - } - - return new ItemListPrompt(); - - } } private class EffectListPrompt extends FixedSetPrompt { @@ -1454,15 +1382,15 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String text = GOLD + "- Event Effects -\n"; + String text = GOLD + "- " + Lang.get("eventEditorEffects") + " -\n"; if (context.getSessionData("evtEffects") == null) { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Add effect (None set)\n"; - text += GRAY + "2 - Add effect location (No effects set)\n"; - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorAddEffect") + " (" + Lang.get("noneSet") + ")\n"; + text += GRAY + "2 - Add effect location (" + Lang.get("eventEditorNoEffects") + ")\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("clear") + "\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("done"); } else { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Add effect\n"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorAddEffect") + "\n"; for (String s : getEffects(context)) { text += GRAY + " - " + AQUA + s + "\n"; @@ -1470,10 +1398,10 @@ public class EventFactory implements ConversationAbandonedListener { } if (context.getSessionData("evtEffectLocations") == null) { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Add effect location (None set)\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorAddEffectLocation") + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Add effect location\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorAddEffectLocation") + "\n"; for (String s : getEffectLocations(context)) { text += GRAY + " - " + AQUA + s + "\n"; @@ -1482,8 +1410,8 @@ public class EventFactory implements ConversationAbandonedListener { } - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("clear") + "\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("done"); } @@ -1498,14 +1426,14 @@ public class EventFactory implements ConversationAbandonedListener { return new EffectPrompt(); } else if (input.equalsIgnoreCase("2")) { if (context.getSessionData("evtEffects") == null) { - context.getForWhom().sendRawMessage(RED + "You must add effects first!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorMustAddEffects")); return new EffectListPrompt(); } else { selectedEffectLocations.put((Player) context.getForWhom(), null); return new EffectLocationPrompt(); } } else if (input.equalsIgnoreCase("3")) { - context.getForWhom().sendRawMessage(YELLOW + "Event effects cleared."); + context.getForWhom().sendRawMessage(YELLOW + Lang.get("eventEditorEffectsCleared")); context.setSessionData("evtEffects", null); context.setSessionData("evtEffectLocations", null); return new EffectListPrompt(); @@ -1529,7 +1457,7 @@ public class EventFactory implements ConversationAbandonedListener { if (one == two) { return new CreateMenuPrompt(); } else { - context.getForWhom().sendRawMessage(RED + "The " + GOLD + "effects list " + RED + "and " + GOLD + "effect locations list " + RED + "are not the same size!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorListSizeMismatch")); return new EffectListPrompt(); } } @@ -1551,7 +1479,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Right-click on a block to play an effect at, then enter \"add\" to add it to the list,\nor enter \"cancel\" to return"; + return YELLOW + Lang.get("eventEditorEffectLocationPrompt"); } @@ -1560,7 +1488,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("add")) { + if (input.equalsIgnoreCase(Lang.get("cmdAdd"))) { Block block = selectedEffectLocations.get(player); if (block != null) { @@ -1579,13 +1507,13 @@ public class EventFactory implements ConversationAbandonedListener { selectedEffectLocations.remove(player); } else { - player.sendMessage(RED + "You must select a block first."); + player.sendMessage(RED + Lang.get("eventEditorSelectBlockFirst")); return new EffectLocationPrompt(); } return new EffectListPrompt(); - } else if (input.equalsIgnoreCase("cancel")) { + } else if (input.equalsIgnoreCase(Lang.get("cmdCancel"))) { selectedEffectLocations.remove(player); return new EffectListPrompt(); @@ -1603,18 +1531,18 @@ public class EventFactory implements ConversationAbandonedListener { public String getPromptText(ConversationContext context) { String effects = PINK + "- Effects - \n"; - effects += PURPLE + "BLAZE_SHOOT " + GRAY + "- Sound of a Blaze firing\n"; - effects += PURPLE + "BOW_FIRE " + GRAY + "- Sound of a bow firing\n"; - effects += PURPLE + "CLICK1 " + GRAY + "- A click sound\n"; - effects += PURPLE + "CLICK2 " + GRAY + "- A different click sound\n"; - effects += PURPLE + "DOOR_TOGGLE " + GRAY + "- Sound of a door opening or closing\n"; - effects += PURPLE + "EXTINGUISH " + GRAY + "- Sound of fire being extinguished\n"; - effects += PURPLE + "GHAST_SHOOT " + GRAY + "- Sound of a Ghast firing\n"; - effects += PURPLE + "GHAST_SHRIEK " + GRAY + "- Sound of a Ghast shrieking\n"; - effects += PURPLE + "ZOMBIE_CHEW_IRON_DOOR " + GRAY + "- Sound of a Zombie chewing an iron door\n"; - effects += PURPLE + "ZOMBIE_CHEW_WOODEN_DOOR " + GRAY + "- Sound of a Zombie chewing a wooden door\n"; + effects += PURPLE + "BLAZE_SHOOT " + GRAY + "- " + Lang.get("effBlazeShoot") + "\n"; + effects += PURPLE + "BOW_FIRE " + GRAY + "- " + Lang.get("effBowFire") + "\n"; + effects += PURPLE + "CLICK1 " + GRAY + "- " + Lang.get("effClick1") + "\n"; + effects += PURPLE + "CLICK2 " + GRAY + "- " + Lang.get("effClick2") + "\n"; + effects += PURPLE + "DOOR_TOGGLE " + GRAY + "- " + Lang.get("effDoorToggle") + "\n"; + effects += PURPLE + "EXTINGUISH " + GRAY + "- " + Lang.get("effExtinguish") + "\n"; + effects += PURPLE + "GHAST_SHOOT " + GRAY + "- " + Lang.get("effGhastShoot") + "\n"; + effects += PURPLE + "GHAST_SHRIEK " + GRAY + "- " + Lang.get("effGhastShriek") + "\n"; + effects += PURPLE + "ZOMBIE_CHEW_IRON_DOOR " + GRAY + "- " + Lang.get("effZombieWood") + "\n"; + effects += PURPLE + "ZOMBIE_CHEW_WOODEN_DOOR " + GRAY + "- " + Lang.get("effZombieIron") + "\n"; - return YELLOW + effects + "Enter an effect name to add it to the list, or enter \"cancel\" to return"; + return YELLOW + effects + Lang.get("effEnterName"); } @@ -1623,7 +1551,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("cancel") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { if (Quests.getEffect(input.toUpperCase()) != null) { @@ -1640,7 +1568,7 @@ public class EventFactory implements ConversationAbandonedListener { return new EffectListPrompt(); } else { - player.sendMessage(PINK + input + " " + RED + "is not a valid effect name!"); + player.sendMessage(PINK + input + " " + RED + Lang.get("eventEditorInvalidEffect")); return new EffectPrompt(); } @@ -1665,28 +1593,28 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String text = GOLD + "- Event Storm -\n"; + String text = GOLD + "- " + Lang.get("eventEditorStorm") + " -\n"; if (context.getSessionData("evtStormWorld") == null) { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set world (None set)\n"; - text += GRAY + "2 - Set duration (No world set)\n"; - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorSetWorld") + " (" + Lang.get("noneSet") + ")\n"; + text += GRAY + "2 - " + Lang.get("eventEditorSetDuration") + " " + Lang.get("eventEditorNoWorld") + "\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("clear") + "\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("done"); } else { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set world (" + AQUA + ((String) context.getSessionData("evtStormWorld")) + YELLOW + ")\n"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorSetWorld") + " (" + AQUA + ((String) context.getSessionData("evtStormWorld")) + YELLOW + ")\n"; if (context.getSessionData("evtStormDuration") == null) { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set duration (None set)\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorSetDuration") + " (" + Lang.get("noneSet") + ")\n"; } else { Long dur = (Long) context.getSessionData("evtStormDuration"); - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set duration (" + AQUA + Quests.getTime(dur) + YELLOW + ")\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorSetDuration") + " (" + AQUA + Quests.getTime(dur) + YELLOW + ")\n"; } - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("clear") + "\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("done"); } @@ -1701,20 +1629,20 @@ public class EventFactory implements ConversationAbandonedListener { return new StormWorldPrompt(); } else if (input.equalsIgnoreCase("2")) { if (context.getSessionData("evtStormWorld") == null) { - context.getForWhom().sendRawMessage(RED + "You must set a world first!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorSetWorldFirst")); return new StormPrompt(); } else { return new StormDurationPrompt(); } } else if (input.equalsIgnoreCase("3")) { - context.getForWhom().sendRawMessage(YELLOW + "Storm data cleared."); + context.getForWhom().sendRawMessage(YELLOW + Lang.get("eventEditorStormCleared")); context.setSessionData("evtStormWorld", null); context.setSessionData("evtStormDuration", null); return new StormPrompt(); } else if (input.equalsIgnoreCase("4")) { if (context.getSessionData("evtStormWorld") != null && context.getSessionData("evtStormDuration") == null) { - context.getForWhom().sendRawMessage(RED + "You must set a storm duration!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorMustSetStormDuration")); return new StormPrompt(); } else { return new CreateMenuPrompt(); @@ -1731,14 +1659,14 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String effects = PINK + "- Worlds - \n" + PURPLE; + String effects = PINK + "- " + Lang.get("worlds") + " - \n" + PURPLE; for (World w : quests.getServer().getWorlds()) { effects += w.getName() + ", "; } effects = effects.substring(0, effects.length()); - return YELLOW + effects + "Enter a world name for the storm to occur in, or enter \"cancel\" to return"; + return YELLOW + effects + Lang.get("eventEditorEnterStormWorld"); } @@ -1747,14 +1675,14 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("cancel") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { if (quests.getServer().getWorld(input) != null) { context.setSessionData("evtStormWorld", quests.getServer().getWorld(input).getName()); } else { - player.sendMessage(PINK + input + " " + RED + "is not a valid world name!"); + player.sendMessage(PINK + input + " " + RED + Lang.get("eventEditorInvalidWorld")); return new StormWorldPrompt(); } @@ -1769,7 +1697,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter duration (in milliseconds)"; + return YELLOW + Lang.get("eventEditorEnterStormDuration"); } @@ -1777,7 +1705,7 @@ public class EventFactory implements ConversationAbandonedListener { protected Prompt acceptValidatedInput(ConversationContext context, Number input) { if (input.longValue() < 1000) { - context.getForWhom().sendRawMessage(RED + "Amount must be at least 1 second! (1000 milliseconds)"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorAtLeastOneSecond")); return new StormDurationPrompt(); } @@ -1798,30 +1726,30 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String text = GOLD + "- Event Thunder -\n"; + String text = GOLD + "- " + Lang.get("eventEditorThunder") + " -\n"; if (context.getSessionData("evtThunderWorld") == null) { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set world (None set)\n"; - text += GRAY + "2 - Set duration (No world set)\n"; - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorSetWorld") + " (" + Lang.get("noneSet") + ")\n"; + text += GRAY + "2 - " + Lang.get("eventEditorSetDuration") + " " + Lang.get("eventEditorNoWorld") + "\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("clear") + "\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("done"); } else { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set world (" + AQUA + ((String) context.getSessionData("evtThunderWorld")) + YELLOW + ")\n"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorSetWorld") + " (" + AQUA + ((String) context.getSessionData("evtThunderWorld")) + YELLOW + ")\n"; if (context.getSessionData("evtThunderDuration") == null) { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set duration (None set)\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorSetDuration") + " (" + Lang.get("noneSet") + ")\n"; } else { Long dur = (Long) context.getSessionData("evtThunderDuration"); - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set duration (" + AQUA + Quests.getTime(dur) + YELLOW + ")\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorSetDuration") + " (" + AQUA + Quests.getTime(dur) + YELLOW + ")\n"; } - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("clear") + "\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("done"); } @@ -1837,20 +1765,20 @@ public class EventFactory implements ConversationAbandonedListener { return new ThunderWorldPrompt(); } else if (input.equalsIgnoreCase("2")) { if (context.getSessionData("evtThunderWorld") == null) { - context.getForWhom().sendRawMessage(RED + "You must set a world first!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorSetWorldFirst")); return new ThunderPrompt(); } else { return new ThunderDurationPrompt(); } } else if (input.equalsIgnoreCase("3")) { - context.getForWhom().sendRawMessage(YELLOW + "Thunder data cleared."); + context.getForWhom().sendRawMessage(YELLOW + Lang.get("eventEditorThunderCleared")); context.setSessionData("evtThunderWorld", null); context.setSessionData("evtThunderDuration", null); return new ThunderPrompt(); } else if (input.equalsIgnoreCase("4")) { if (context.getSessionData("evtThunderWorld") != null && context.getSessionData("evtThunderDuration") == null) { - context.getForWhom().sendRawMessage(RED + "You must set a thunder duration!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorMustSetThunderDuration")); return new ThunderPrompt(); } else { return new CreateMenuPrompt(); @@ -1874,7 +1802,7 @@ public class EventFactory implements ConversationAbandonedListener { effects = effects.substring(0, effects.length()); - return YELLOW + effects + "Enter a world name for the thunder to occur in, or enter \"cancel\" to return"; + return YELLOW + effects + Lang.get("eventEditorEnterThunderWorld"); } @@ -1883,14 +1811,14 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("cancel") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { if (quests.getServer().getWorld(input) != null) { context.setSessionData("evtThunderWorld", quests.getServer().getWorld(input).getName()); } else { - player.sendMessage(PINK + input + " " + RED + "is not a valid world name!"); + player.sendMessage(PINK + input + " " + RED + Lang.get("eventEditorInvalidWorld")); return new ThunderWorldPrompt(); } @@ -1905,7 +1833,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter duration (in milliseconds)"; + return YELLOW + Lang.get("eventEditorEnterDuration"); } @@ -1913,7 +1841,7 @@ public class EventFactory implements ConversationAbandonedListener { protected Prompt acceptValidatedInput(ConversationContext context, Number input) { if (input.longValue() < 1000) { - context.getForWhom().sendRawMessage(RED + "Amount must be at least 1 second! (1000 milliseconds)"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorAtLeastOneSecond")); return new ThunderDurationPrompt(); } else { context.setSessionData("evtThunderDuration", input.longValue()); @@ -1935,36 +1863,36 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String text = GOLD + "- Event Mob Spawns -\n"; + String text = GOLD + "- " + Lang.get("eventEditorMobSpawns") + " -\n"; if (context.getSessionData("evtMobTypes") == null) { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set mob types (None set)\n"; - text += GRAY + "2 - Set mob amounts (No types set)\n"; - text += GRAY + "3 - Add spawn location (No types set)\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorSetMobTypes") + " (" + Lang.get("noneSet") + ")\n"; + text += GRAY + "2 - " + Lang.get("eventEditorSetMobAmounts") + " " + Lang.get("eventEditorNoTypesSet") + "\n"; + text += GRAY + "3 - " + Lang.get("eventEditorAddSpawnLocation") + " " + Lang.get("eventEditorNoTypesSet") + "\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("clear") + "\n"; + text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - " + Lang.get("done"); } else { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set mob types\n"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorSetMobTypes") + "\n"; for (String s : (LinkedList) context.getSessionData("evtMobTypes")) { text += GRAY + " - " + AQUA + s + "\n"; } if (context.getSessionData("evtMobAmounts") == null) { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set mob amounts (None set)\n"; - text += GRAY + "3 - Add spawn location (No amounts set)\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorSetMobAmounts") + " (" + Lang.get("noneSet") + ")\n"; + text += GRAY + "3 - " + Lang.get("eventEditorAddSpawnLocation") + Lang.get("eventEditorNoAmountsSet") + "\n"; } else { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set mob amounts\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorSetMobAmounts"); for (int i : (LinkedList) context.getSessionData("evtMobAmounts")) { text += GRAY + " - " + DARKAQUA + i + "\n"; } if (context.getSessionData("evtMobLocations") == null) { - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Add mob location (None set)\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("eventEditorAddSpawnLocation") + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Add spawn location\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("eventEditorAddSpawnLocation") + "\n"; for (String s : (LinkedList) context.getSessionData("evtMobLocations")) { text += GRAY + " - " + GREEN + s + "\n"; } @@ -1973,8 +1901,8 @@ public class EventFactory implements ConversationAbandonedListener { } - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Clear\n"; - text += GREEN + "" + BOLD + "5" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("clear") + "\n"; + text += GREEN + "" + BOLD + "5" + RESET + YELLOW + " - " + Lang.get("done"); } @@ -1989,24 +1917,24 @@ public class EventFactory implements ConversationAbandonedListener { return new MobTypesPrompt(); } else if (input.equalsIgnoreCase("2")) { if (context.getSessionData("evtMobTypes") == null) { - context.getForWhom().sendRawMessage(RED + "You must set mob types first!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorMustSetMobTypesFirst")); return new MobPrompt(); } else { return new MobAmountsPrompt(); } } else if (input.equalsIgnoreCase("3")) { if (context.getSessionData("evtMobTypes") == null) { - context.getForWhom().sendRawMessage(RED + "You must set mob types and amounts first!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorMustSetMobTypesAndAmountsFirst")); return new MobPrompt(); } else if (context.getSessionData("evtMobAmounts") == null) { - context.getForWhom().sendRawMessage(RED + "You must set mob amounts first!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorMustSetMobAmountsFirst")); return new MobPrompt(); } else { selectedMobLocations.put((Player) context.getForWhom(), null); return new MobLocationPrompt(); } } else if (input.equalsIgnoreCase("4")) { - context.getForWhom().sendRawMessage(YELLOW + "Mob spawns cleared."); + context.getForWhom().sendRawMessage(YELLOW + Lang.get("eventEditorMobSpawnsCleared")); context.setSessionData("evtMobTypes", null); context.setSessionData("evtMobAmounts", null); context.setSessionData("evtMobLocations", null); @@ -2038,7 +1966,7 @@ public class EventFactory implements ConversationAbandonedListener { if (one == two && two == three) { return new CreateMenuPrompt(); } else { - context.getForWhom().sendRawMessage(RED + "The " + GOLD + "mob types list " + RED + ", " + GOLD + "mob amounts list" + RED + ", and " + GOLD + "item amounts list " + RED + "are not the same size!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorListSizeMismatch")); return new MobPrompt(); } @@ -2053,7 +1981,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String mobs = PINK + "- Mobs - \n"; + String mobs = PINK + "- " + Lang.get("mobs") + " - \n"; mobs += PURPLE + "Bat, "; mobs += PURPLE + "Blaze, "; mobs += PURPLE + "CaveSpider, "; @@ -2083,7 +2011,7 @@ public class EventFactory implements ConversationAbandonedListener { mobs += PURPLE + "Wolf, "; mobs += PURPLE + "Zombie\n"; - return mobs + YELLOW + "Enter mob names separating each one by a space, or enter \"cancel\" to return"; + return mobs + YELLOW + Lang.get("eventEditorSetMobTypesPrompt"); } @@ -2092,7 +2020,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("cancel") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { LinkedList mobTypes = new LinkedList(); for (String s : input.split(" ")) { @@ -2103,7 +2031,7 @@ public class EventFactory implements ConversationAbandonedListener { context.setSessionData("evtMobTypes", mobTypes); } else { - player.sendMessage(PINK + s + " " + RED + "is not a valid mob name!"); + player.sendMessage(PINK + s + " " + RED + Lang.get("eventEditorInvalidMob")); return new MobTypesPrompt(); } @@ -2121,7 +2049,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter mob amounts separating each one by a space, or enter \"cancel\" to return"; + return YELLOW + Lang.get("eventEditorSetMobAmountsPrompt"); } @@ -2130,7 +2058,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("cancel") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { LinkedList mobAmounts = new LinkedList(); for (String s : input.split(" ")) { @@ -2140,7 +2068,7 @@ public class EventFactory implements ConversationAbandonedListener { int i = Integer.parseInt(s); if (i < 1) { - player.sendMessage(PINK + input + " " + RED + "is not greater than zero!"); + player.sendMessage(PINK + input + " " + RED + Lang.get("eventEditorNotGreaterThanZero")); return new MobAmountsPrompt(); } @@ -2148,7 +2076,7 @@ public class EventFactory implements ConversationAbandonedListener { } catch (Exception e) { - player.sendMessage(PINK + input + " " + RED + "is not a number!"); + player.sendMessage(PINK + input + " " + RED + Lang.get("eventEditorNotANumber")); return new MobAmountsPrompt(); } @@ -2168,7 +2096,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Right-click on a block to select it, then enter \"add\" to add it to the mob spawn location list,\nor enter \"cancel\" to return"; + return YELLOW + Lang.get("eventEditorMobLocationPrompt"); } @@ -2177,7 +2105,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("add")) { + if (input.equalsIgnoreCase(Lang.get("cmdAdd"))) { Block block = selectedMobLocations.get(player); if (block != null) { @@ -2196,13 +2124,13 @@ public class EventFactory implements ConversationAbandonedListener { selectedMobLocations.remove(player); } else { - player.sendMessage(RED + "You must select a block first."); + player.sendMessage(RED + Lang.get("eventEditorSelectBlockFirst")); return new MobLocationPrompt(); } return new MobPrompt(); - } else if (input.equalsIgnoreCase("cancel")) { + } else if (input.equalsIgnoreCase(Lang.get("cmdCancel"))) { selectedMobLocations.remove(player); return new MobPrompt(); @@ -2219,7 +2147,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Right-click on a block to spawn a lightning strike at, then enter \"add\" to add it to the list,\nor enter \"clear\" to clear the locations list, or \"cancel\" to return"; + return YELLOW + Lang.get("eventEditorLightningPrompt"); } @@ -2228,7 +2156,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("add")) { + if (input.equalsIgnoreCase(Lang.get("cmdAdd"))) { Block block = selectedLightningLocations.get(player); if (block != null) { @@ -2247,19 +2175,19 @@ public class EventFactory implements ConversationAbandonedListener { selectedLightningLocations.remove(player); } else { - player.sendMessage(RED + "You must select a block first."); + player.sendMessage(RED + Lang.get("eventEditorSelectBlockFirst")); return new LightningPrompt(); } return new CreateMenuPrompt(); - } else if (input.equalsIgnoreCase("clear")) { + } else if (input.equalsIgnoreCase(Lang.get("cmdClear"))) { context.setSessionData("evtLightningStrikes", null); selectedLightningLocations.remove(player); return new CreateMenuPrompt(); - } else if (input.equalsIgnoreCase("cancel")) { + } else if (input.equalsIgnoreCase(Lang.get("cmdCancel"))) { selectedLightningLocations.remove(player); return new CreateMenuPrompt(); @@ -2282,35 +2210,35 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String text = GOLD + "- Event Potion Effects -\n"; + String text = GOLD + "- " + Lang.get("eventEditorPotionEffects") + " -\n"; if (context.getSessionData("evtPotionTypes") == null) { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set potion effect types (None set)\n"; - text += GRAY + "2 - Set potion effect durations (No types set)\n"; - text += GRAY + "3 - Set potion effect magnitudes (No types set)\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Clear\n"; - text += GREEN + "" + BOLD + "5" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorSetPotionEffects") + " (" + Lang.get("noneSet") + ")\n"; + text += GRAY + "2 - " + Lang.get("eventEditorSetPotionDurations") + " " + Lang.get("eventEditorNoTypesSet") + "\n"; + text += GRAY + "3 - " + Lang.get("eventEditorSetPotionMagnitudes") + " " + Lang.get("eventEditorNoTypesSet") + "\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("clear") + "\n"; + text += GREEN + "" + BOLD + "5" + RESET + YELLOW + " - " + Lang.get("done"); } else { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set potion effect types\n"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - " + Lang.get("eventEditorSetPotionEffects") + "\n"; for (String s : (LinkedList) context.getSessionData("evtPotionTypes")) { text += GRAY + " - " + AQUA + s + "\n"; } if (context.getSessionData("evtPotionDurations") == null) { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set potion effect durations (None set)\n"; - text += GRAY + "3 - Set potion effect magnitudes (No durations set)\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorSetPotionDurations") + " (" + Lang.get("noneSet") + ")\n"; + text += GRAY + "3 - " + Lang.get("eventEditorSetPotionMagnitudes") + " " + Lang.get("eventEditorNoDurationsSet") + "\n"; } else { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set potion effect durations\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - " + Lang.get("eventEditorNoDurationsSet") + "\n"; for (Long l : (LinkedList) context.getSessionData("evtPotionDurations")) { text += GRAY + " - " + DARKAQUA + Quests.getTime(l*50L) + "\n"; } if (context.getSessionData("evtPotionMagnitudes") == null) { - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set potion effect magnitudes (None set)\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("eventEditorSetPotionMagnitudes") + " (" + Lang.get("noneSet") + ")\n"; } else { - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set potion effect magnitudes\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - " + Lang.get("eventEditorSetPotionMagnitudes") + "\n"; for (int i : (LinkedList) context.getSessionData("evtPotionMagnitudes")) { text += GRAY + " - " + PURPLE + i + "\n"; } @@ -2319,8 +2247,8 @@ public class EventFactory implements ConversationAbandonedListener { } - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Clear\n"; - text += GREEN + "" + BOLD + "5" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - " + Lang.get("clear") + "\n"; + text += GREEN + "" + BOLD + "5" + RESET + YELLOW + " - " + Lang.get("done"); } @@ -2335,24 +2263,24 @@ public class EventFactory implements ConversationAbandonedListener { return new PotionTypesPrompt(); } else if (input.equalsIgnoreCase("2")) { if (context.getSessionData("evtPotionTypes") == null) { - context.getForWhom().sendRawMessage(RED + "You must set potion effect types first!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorMustSetPotionTypesFirst")); return new PotionEffectPrompt(); } else { return new PotionDurationsPrompt(); } } else if (input.equalsIgnoreCase("3")) { if (context.getSessionData("evtPotionTypes") == null) { - context.getForWhom().sendRawMessage(RED + "You must potion effect types and durations first!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorMustSetPotionTypesAndDurationsFirst")); return new PotionEffectPrompt(); } else if (context.getSessionData("evtPotionDurations") == null) { - context.getForWhom().sendRawMessage(RED + "You must set potion effect durations first!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorMustSetPotionDurationsFirst")); return new PotionEffectPrompt(); } else { return new PotionMagnitudesPrompt(); } } else if (input.equalsIgnoreCase("4")) { - context.getForWhom().sendRawMessage(YELLOW + "Potion effects cleared."); + context.getForWhom().sendRawMessage(YELLOW + Lang.get("eventEditorPotionsCleared")); context.setSessionData("evtPotionTypes", null); context.setSessionData("evtPotionDurations", null); context.setSessionData("evtPotionMagnitudes", null); @@ -2384,7 +2312,7 @@ public class EventFactory implements ConversationAbandonedListener { if (one == two && two == three) { return new CreateMenuPrompt(); } else { - context.getForWhom().sendRawMessage(RED + "The " + GOLD + "effect types list " + RED + ", " + GOLD + "effect durations list" + RED + ", and " + GOLD + "effect magnitudes list " + RED + "are not the same size!"); + context.getForWhom().sendRawMessage(RED + Lang.get("eventEditorListSizeMismatch")); return new PotionEffectPrompt(); } @@ -2399,12 +2327,12 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String effs = PINK + "- Potion Effects - \n"; + String effs = PINK + "- " + Lang.get("eventEditorPotionEffects") + " - \n"; for (PotionEffectType pet : PotionEffectType.values()) { effs += (pet != null && pet.getName() != null) ? (PURPLE + pet.getName() + "\n") : ""; } - return effs + YELLOW + "Enter potion effect types separating each one by a space, or enter \"cancel\" to return"; + return effs + YELLOW + Lang.get("eventEditorSetPotionEffectsPrompt"); } @@ -2413,7 +2341,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("cancel") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { LinkedList effTypes = new LinkedList(); for (String s : input.split(" ")) { @@ -2425,7 +2353,7 @@ public class EventFactory implements ConversationAbandonedListener { context.setSessionData("evtPotionTypes", effTypes); } else { - player.sendMessage(PINK + s + " " + RED + "is not a valid potion effect type!"); + player.sendMessage(PINK + s + " " + RED + Lang.get("eventEditorInvalidPotionType")); return new PotionTypesPrompt(); } @@ -2443,7 +2371,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter effect durations (in milliseconds) separating each one by a space,\n or enter \"cancel\" to return"; + return YELLOW + Lang.get("eventEditorSetPotionDurationsPrompt"); } @@ -2452,7 +2380,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("cancel") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { LinkedList effDurations = new LinkedList(); for (String s : input.split(" ")) { @@ -2462,7 +2390,7 @@ public class EventFactory implements ConversationAbandonedListener { long l = Long.parseLong(s); if (l < 1000) { - player.sendMessage(PINK + s + " " + RED + "is not greater than 1 second! (1000 milliseconds)"); + player.sendMessage(PINK + s + " " + RED + Lang.get("eventEditorNotGreaterThanOneSecond")); return new PotionDurationsPrompt(); } @@ -2470,7 +2398,7 @@ public class EventFactory implements ConversationAbandonedListener { } catch (Exception e) { - player.sendMessage(PINK + s + " " + RED + "is not a number!"); + player.sendMessage(PINK + s + " " + RED + Lang.get("eventEditorNotANumber")); return new PotionDurationsPrompt(); } @@ -2490,7 +2418,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter potion magnitudes separating each one by a space, or enter \"cancel\" to return"; + return YELLOW + Lang.get("eventEditorSetPotionMagnitudesPrompt"); } @@ -2499,7 +2427,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("cancel") == false) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { LinkedList magAmounts = new LinkedList(); for (String s : input.split(" ")) { @@ -2509,7 +2437,7 @@ public class EventFactory implements ConversationAbandonedListener { int i = Integer.parseInt(s); if (i < 1) { - player.sendMessage(PINK + s + " " + RED + "is not greater than zero!"); + player.sendMessage(PINK + s + " " + RED + Lang.get("eventEditorNotGreaterThanZero")); return new PotionMagnitudesPrompt(); } @@ -2517,7 +2445,7 @@ public class EventFactory implements ConversationAbandonedListener { } catch (Exception e) { - player.sendMessage(PINK + s + " " + RED + "is not a number!"); + player.sendMessage(PINK + s + " " + RED + Lang.get("eventEditorNotANumber")); return new PotionMagnitudesPrompt(); } @@ -2537,7 +2465,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter hunger level, or -1 to remove it"; + return YELLOW + Lang.get("eventEditorSetHungerPrompt"); } @@ -2547,7 +2475,7 @@ public class EventFactory implements ConversationAbandonedListener { if (input.intValue() != -1) { if(input.intValue() < 0){ - ((Player)context.getForWhom()).sendMessage(RED + "Hunger level must be at least 0!"); + ((Player)context.getForWhom()).sendMessage(RED + Lang.get("eventEditorHungerLevelAtLeastZero")); return new HungerPrompt(); }else{ context.setSessionData("evtHunger", (Integer)input.intValue()); @@ -2567,7 +2495,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter saturation level, or -1 to remove it"; + return YELLOW + Lang.get("eventEditorSetSaturationPrompt"); } @@ -2577,7 +2505,7 @@ public class EventFactory implements ConversationAbandonedListener { if (input.intValue() != -1) { if(input.intValue() < 0){ - ((Player)context.getForWhom()).sendMessage(RED + "Saturation level must be at least 0!"); + ((Player)context.getForWhom()).sendMessage(RED + Lang.get("eventEditorSaturationLevelAtLeastZero")); return new SaturationPrompt(); }else{ context.setSessionData("evtSaturation", (Integer)input.intValue()); @@ -2597,7 +2525,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Enter health level, or -1 to remove it"; + return YELLOW + Lang.get("eventEditorSetHealthPrompt"); } @@ -2607,7 +2535,7 @@ public class EventFactory implements ConversationAbandonedListener { if (input.intValue() != -1) { if(input.intValue() < 0){ - ((Player)context.getForWhom()).sendMessage(RED + "Health level must be at least 0!"); + ((Player)context.getForWhom()).sendMessage(RED + Lang.get("eventEditorHealthLevelAtLeastZero")); return new HealthPrompt(); }else{ context.setSessionData("evtHealth", (Integer)input.intValue()); @@ -2627,7 +2555,7 @@ public class EventFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - return YELLOW + "Right-click on a block to teleport the player to, then enter \"done\" to finish,\nor enter \"clear\" to clear the teleport location, or \"cancel\" to return"; + return YELLOW + Lang.get("eventEditorSetTeleportPrompt"); } @@ -2636,7 +2564,7 @@ public class EventFactory implements ConversationAbandonedListener { Player player = (Player) context.getForWhom(); - if (input.equalsIgnoreCase("done")) { + if (input.equalsIgnoreCase(Lang.get("cmdDone"))) { Block block = selectedTeleportLocations.get(player); if (block != null) { @@ -2647,19 +2575,19 @@ public class EventFactory implements ConversationAbandonedListener { selectedTeleportLocations.remove(player); } else { - player.sendMessage(RED + "You must select a block first."); + player.sendMessage(RED + Lang.get("eventEditorSelectBlockFirst")); return new TeleportPrompt(); } return new CreateMenuPrompt(); - } else if (input.equalsIgnoreCase("clear")) { + } else if (input.equalsIgnoreCase(Lang.get("cmdClear"))) { context.setSessionData("evtTeleportLocation", null); selectedTeleportLocations.remove(player); return new CreateMenuPrompt(); - } else if (input.equalsIgnoreCase("cancel")) { + } else if (input.equalsIgnoreCase(Lang.get("cmdCancel"))) { selectedTeleportLocations.remove(player); return new CreateMenuPrompt(); @@ -2670,4 +2598,35 @@ public class EventFactory implements ConversationAbandonedListener { } } + + private class CommandsPrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext context) { + + String text = GOLD + "" + ITALIC + Lang.get("eventEditorCommandsNote"); + return YELLOW + Lang.get("eventEditorSetCommandsPrompt") + "\n" + text; + + + } + + @Override + public Prompt acceptInput(ConversationContext context, String input) { + + Player player = (Player) context.getForWhom(); + + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false && input.equalsIgnoreCase(Lang.get("cmdClear")) == false) { + + String[] commands = input.split(","); + LinkedList cmdList = new LinkedList(); + cmdList.addAll(Arrays.asList(commands)); + context.setSessionData("evtCommands", cmdList); + + }else if(input.equalsIgnoreCase(Lang.get("cmdClear"))) + context.setSessionData("evtCommands", null); + + return new CreateMenuPrompt(); + + } + } } diff --git a/src/me/blackvein/quests/NpcEffectThread.java b/src/me/blackvein/quests/NpcEffectThread.java index 714387dea..5ccb7b22b 100644 --- a/src/me/blackvein/quests/NpcEffectThread.java +++ b/src/me/blackvein/quests/NpcEffectThread.java @@ -149,10 +149,6 @@ public class NpcEffectThread implements Runnable{ e.printStackTrace(); } - } else{ - - Quests.log.severe("[Quests] No particle effect specified!"); - } } diff --git a/src/me/blackvein/quests/NpcListener.java b/src/me/blackvein/quests/NpcListener.java index 3e0ebb841..1d3b93946 100644 --- a/src/me/blackvein/quests/NpcListener.java +++ b/src/me/blackvein/quests/NpcListener.java @@ -1,10 +1,14 @@ package me.blackvein.quests; +import java.text.MessageFormat; +import java.util.LinkedList; +import me.blackvein.quests.util.ItemUtil; import net.citizensnpcs.api.event.NPCDeathEvent; import net.citizensnpcs.api.event.NPCRightClickEvent; import net.citizensnpcs.api.npc.NPC; import org.bukkit.ChatColor; import org.bukkit.conversations.Conversable; +import org.bukkit.conversations.Conversation; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; @@ -26,53 +30,82 @@ public class NpcListener implements Listener { @EventHandler(priority = EventPriority.LOWEST) public void onNPCRightClick(NPCRightClickEvent evt) { + + if (evt.getClicker().isConversing() == false) { - final Player player = evt.getClicker(); - final Quester quester = plugin.getQuester(player.getName()); - boolean delivery = false; + final Player player = evt.getClicker(); + final Quester quester = plugin.getQuester(player.getName()); + boolean delivery = false; - if(quester.hasObjective("deliverItem") && player.getItemInHand() != null){ + if (quester.hasObjective("deliverItem") && player.getItemInHand() != null) { - ItemStack hand = player.getItemInHand(); - if(quester.itemsDelivered.containsKey(hand.getType())){ - - NPC clicked = evt.getNPC(); - - for(NPC n : quester.currentStage.itemDeliveryTargets){ - if(n.getId() == clicked.getId()){ - quester.deliverItem(hand); - delivery = true; + ItemStack hand = player.getItemInHand(); + + ItemStack found = null; + + for(ItemStack is : quester.currentStage.itemsToDeliver){ + + if(ItemUtil.compareItems(is, hand, true) == 0){ + found = is; break; } + } + + if (found != null) { + NPC clicked = evt.getNPC(); + + for (NPC n : quester.currentStage.itemDeliveryTargets) { + if (n.getId() == clicked.getId()) { + quester.deliverItem(hand); + delivery = true; + break; + } + } + + } } - } + if (plugin.questNPCs.contains(evt.getNPC()) && delivery == false) { - if (plugin.questNPCs.contains(evt.getNPC()) && delivery == false) { + if (plugin.checkQuester(player.getName()) == false) { + if (quester.hasObjective("talkToNPC")) { - if (plugin.checkQuester(player.getName()) == false) { - if (quester.hasObjective("talkToNPC")) { + quester.interactWithNPC(evt.getNPC()); - quester.interactWithNPC(evt.getNPC()); + } else { - } else { + LinkedList npcQuests = new LinkedList(); - for (Quest q : plugin.quests) { + for (Quest q : plugin.getQuests()) { - if (q.npcStart != null && player.hasPermission("quests.quest")) { + if (q.npcStart != null && q.npcStart.getId() == evt.getNPC().getId()) { + npcQuests.add(q); + } - if (q.npcStart.equals(evt.getNPC()) && quester.completedQuests.contains(q.name) == false) { + } + + + + if (npcQuests.isEmpty() == false && npcQuests.size() > 1) { + + Conversation c = plugin.NPCConversationFactory.buildConversation((Conversable) player); + c.getContext().setSessionData("quests", npcQuests); + c.getContext().setSessionData("npc", evt.getNPC().getName()); + c.begin(); + + } else if (npcQuests.size() == 1) { + + Quest q = npcQuests.get(0); + + if (!quester.completedQuests.contains(q.name)) { if (quester.currentQuest == null) { quester.questToTake = q.name; - String s = - ChatColor.GOLD + "- " + ChatColor.DARK_PURPLE + quester.questToTake + ChatColor.GOLD + " -\n" - + "\n" - + ChatColor.RESET + plugin.getQuest(quester.questToTake).description + "\n"; + String s = extracted(quester); player.sendMessage(s); plugin.conversationFactory.buildConversation((Conversable) player).begin(); @@ -82,23 +115,17 @@ public class NpcListener implements Listener { } - break; - - } else if (q.npcStart.equals(evt.getNPC()) && quester.completedQuests.contains(q.name) == true) { + } else if (quester.completedQuests.contains(q.name)) { if (quester.currentQuest == null) { if (quester.getDifference(q) > 0) { player.sendMessage(ChatColor.YELLOW + "You may not take " + ChatColor.AQUA + q.name + ChatColor.YELLOW + " again for another " + ChatColor.DARK_PURPLE + Quests.getTime(quester.getDifference(q)) + ChatColor.YELLOW + "."); - } else if (quester.completedQuests.contains(q.name) && q.redoDelay < 0) { + } else if (q.redoDelay < 0) { player.sendMessage(ChatColor.YELLOW + "You have already completed " + ChatColor.AQUA + q.name + ChatColor.YELLOW + "."); - }else{ - + } else { quester.questToTake = q.name; - String s = - ChatColor.GOLD + "- " + ChatColor.DARK_PURPLE + quester.questToTake + ChatColor.GOLD + " -\n" - + "\n" - + ChatColor.RESET + plugin.getQuest(quester.questToTake).description + "\n"; + String s = extracted(quester); player.sendMessage(s); @@ -111,12 +138,11 @@ public class NpcListener implements Listener { } - break; - } } + } } @@ -124,56 +150,34 @@ public class NpcListener implements Listener { } } - } @EventHandler public void onNPCDeath(NPCDeathEvent evt) { - if (evt.getNPC().getBukkitEntity().getLastDamageCause() instanceof EntityDamageByEntityEvent) { + if (evt.getNPC().getBukkitEntity().getLastDamageCause() instanceof EntityDamageByEntityEvent) { - EntityDamageByEntityEvent damageEvent = (EntityDamageByEntityEvent) evt.getNPC().getBukkitEntity().getLastDamageCause(); - Entity damager = damageEvent.getDamager(); + EntityDamageByEntityEvent damageEvent = (EntityDamageByEntityEvent) evt.getNPC().getBukkitEntity().getLastDamageCause(); + Entity damager = damageEvent.getDamager(); - if (damager != null) { + if (damager != null) { - if (damager instanceof Projectile) { + if (damager instanceof Projectile) { - Projectile p = (Projectile) damager; - if (p.getShooter() instanceof Player) { - - Player player = (Player) p.getShooter(); - boolean okay = true; - - if (plugin.citizens != null) { - if (plugin.citizens.getNPCRegistry().isNPC(player)) { - okay = false; - } - } - - if (okay) { - - Quester quester = plugin.getQuester(player.getName()); - if (quester.hasObjective("killNPC")) { - quester.killNPC(evt.getNPC()); - } - - } - } - - } else if (damager instanceof Player) { + Projectile p = (Projectile) damager; + if (p.getShooter() instanceof Player) { + Player player = (Player) p.getShooter(); boolean okay = true; if (plugin.citizens != null) { - if (plugin.citizens.getNPCRegistry().isNPC(damager)) { + if (plugin.citizens.getNPCRegistry().isNPC(player)) { okay = false; } } if (okay) { - Player player = (Player) damager; Quester quester = plugin.getQuester(player.getName()); if (quester.hasObjective("killNPC")) { quester.killNPC(evt.getNPC()); @@ -182,11 +186,39 @@ public class NpcListener implements Listener { } } + } else if (damager instanceof Player) { + + boolean okay = true; + + if (plugin.citizens != null) { + if (plugin.citizens.getNPCRegistry().isNPC(damager)) { + okay = false; + } + } + + if (okay) { + + Player player = (Player) damager; + Quester quester = plugin.getQuester(player.getName()); + if (quester.hasObjective("killNPC")) { + quester.killNPC(evt.getNPC()); + } + + } } } + } + } - -} + private String extracted(final Quester quester) { + return MessageFormat.format("{0}- {1}{2}{3} -\n\n{4}{5}\n", + ChatColor.GOLD, + ChatColor.DARK_PURPLE, + quester.questToTake, + ChatColor.GOLD, + ChatColor.RESET, plugin.getQuest(quester.questToTake).description); + } +} \ No newline at end of file diff --git a/src/me/blackvein/quests/PacketUtils.java b/src/me/blackvein/quests/PacketUtils.java new file mode 100644 index 000000000..74ecada4e --- /dev/null +++ b/src/me/blackvein/quests/PacketUtils.java @@ -0,0 +1,30 @@ +/** + * + * This software is part of the mcMMOStatsGui + * + * mcMMOStatsGui is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * mcMMOStatsGui is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with mcMMOStatsGui. If not, see . + * + */ +package me.blackvein.quests; + +import net.minecraft.server.v1_5_R3.Packet; +import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class PacketUtils { + + public static void sendPacket(Player player, Packet packet) { + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); + } +} \ No newline at end of file diff --git a/src/me/blackvein/quests/ParticleEffect.java b/src/me/blackvein/quests/ParticleEffect.java index 7dee5f25a..001aa750d 100644 --- a/src/me/blackvein/quests/ParticleEffect.java +++ b/src/me/blackvein/quests/ParticleEffect.java @@ -1,8 +1,9 @@ package me.blackvein.quests; -import net.minecraft.server.v1_5_R2.Packet63WorldParticles; +import me.blackvein.quests.util.ReflectionUtil; +import net.minecraft.server.v1_5_R3.Packet63WorldParticles; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; import org.bukkit.entity.Player; public enum ParticleEffect { @@ -51,15 +52,15 @@ public enum ParticleEffect { public void sendToPlayer(Player player, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) throws Exception { Packet63WorldParticles packet = new Packet63WorldParticles(); - ReflectionUtilities.setValue(packet, "a", particleName); - ReflectionUtilities.setValue(packet, "b", (float) location.getX()); - ReflectionUtilities.setValue(packet, "c", (float) location.getY()); - ReflectionUtilities.setValue(packet, "d", (float) location.getZ()); - ReflectionUtilities.setValue(packet, "e", offsetX); - ReflectionUtilities.setValue(packet, "f", offsetY); - ReflectionUtilities.setValue(packet, "g", offsetZ); - ReflectionUtilities.setValue(packet, "h", speed); - ReflectionUtilities.setValue(packet, "i", count); + ReflectionUtil.setValue(packet, "a", particleName); + ReflectionUtil.setValue(packet, "b", (float) location.getX()); + ReflectionUtil.setValue(packet, "c", (float) location.getY()); + ReflectionUtil.setValue(packet, "d", (float) location.getZ()); + ReflectionUtil.setValue(packet, "e", offsetX); + ReflectionUtil.setValue(packet, "f", offsetY); + ReflectionUtil.setValue(packet, "g", offsetZ); + ReflectionUtil.setValue(packet, "h", speed); + ReflectionUtil.setValue(packet, "i", count); ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } diff --git a/src/me/blackvein/quests/Party.java b/src/me/blackvein/quests/Party.java new file mode 100644 index 000000000..d19e54996 --- /dev/null +++ b/src/me/blackvein/quests/Party.java @@ -0,0 +1,218 @@ +package me.blackvein.quests; + +import java.util.LinkedList; +import org.bukkit.conversations.ConversationAbandonedEvent; +import org.bukkit.conversations.ConversationAbandonedListener; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.ConversationFactory; +import org.bukkit.conversations.ConversationPrefix; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; +import org.bukkit.entity.Player; + +public class Party implements ConversationAbandonedListener, ColorUtil{ + + public static final String partyPrefix = PURPLE + "[" + PINK + "Party" + PURPLE + "] " + RESET; + public static ConversationFactory factory; + private final LinkedList members; + private Quester leader; + private Quest currentQuest = null; + private Quests quests = null; + + public Party(Quests plugin, Quester q){ + + quests = plugin; + members = new LinkedList(); + members.add(q); + leader = q; + + } + + public void initFactory(){ + + factory = new ConversationFactory(quests) + .withModality(false) + .withPrefix(new PartyPrefix()) + .withFirstPrompt(new InvitePrompt()) + .withTimeout(Quests.inviteTimeout) + .thatExcludesNonPlayersWithMessage("Console may not perform this conversation!") + .addConversationAbandonedListener(this); + + } + + public void addMember(Quester q){ + members.add(q); + } + + public void removeMember(Quester q){ + members.remove(q); + } + + public void setLeader(Quester q){ + leader = q; + } + + public void disband(){ + leader.reset(); + leader.currentStage = null; + leader.currentQuest = null; + for(Quester quester : members){ + quester.reset(); + quester.currentStage = null; + quester.currentQuest = null; + } + + members.clear(); + leader = null; + currentQuest = null; + } + + public void setQuest(Quest q){ + currentQuest = q; + } + + public void sendMessage(String msg){ + for(Quester q : members){ + q.getPlayer().sendMessage(partyPrefix + msg); + } + } + + public void sendMessageEx(String msg, Quester exclude){ + for(Quester q : members){ + if(q != exclude) + q.getPlayer().sendMessage(partyPrefix + msg); + } + } + + + public LinkedList getAllMembers(){ + return members; + } + + public LinkedList getMembers(){ + LinkedList mems = new LinkedList(); + mems.addAll(members); + mems.remove(leader); + return mems; + } + + public Quester getLeader(){ + return leader; + } + + public Quester getMember(Player p){ + return getMember(p.getName()); + } + + public Quester getMember(String s){ + for(Quester q : members){ + if(q.name.equalsIgnoreCase(s)) + return q; + } + return null; + } + + public Quest getQuest(){ + return currentQuest; + } + + public void cancelQuest(){ + + for(Quester quester : members){ + quester.reset(); + quester.currentStage = null; + quester.currentQuest = null; + } + + currentQuest = null; + + } + + public boolean isLeader(Quester quester){ + return leader == quester; + } + + public void sendInvite(Quester target){ + + Player player = target.getPlayer(); + + + } + + public void checkSize(){ + + int size = members.size(); + if(currentQuest != null){ + + if(currentQuest.parties > size){ + + sendMessage(RED + "Your party size is not large enough to continue " + PINK + currentQuest.name + RED + ". The Quest has been cancelled."); + cancelQuest(); + + } + + } + + } + + public int getSize(){ + return members.size(); + } + + @Override + public void conversationAbandoned(ConversationAbandonedEvent cae) { + throw new UnsupportedOperationException("Not supported yet.");a + } + + private static class PartyPrefix implements ConversationPrefix { + + @Override + public String getPrefix(ConversationContext cc) { + return "" + GRAY; + } + + + + } + + private class InvitePrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext context) { + + String text = partyPrefix + PINK + "You have been invited to " + PURPLE + ((String) context.getSessionData("inviter")) + PINK + "'s party.\n"; + + return text + YELLOW + "Accept Invite? " + GREEN + "Yes / No"; + + } + + @Override + public Prompt acceptInput(ConversationContext context, String s) { + + Player player = (Player) context.getForWhom(); + + if (s.equalsIgnoreCase("Yes")) { + + String inviterName = (String) context.getSessionData("inviter"); + + Quester quester = + + return Prompt.END_OF_CONVERSATION; + + } else if (s.equalsIgnoreCase("No")) { + + player.sendMessage(partyPrefix + YELLOW + "Declined invite."); + return Prompt.END_OF_CONVERSATION; + + } else { + + player.sendMessage(RED + "Invalid choice. Type \'Yes\' or \'No\'"); + return new InvitePrompt(); + + } + + + } + } + +} diff --git a/src/me/blackvein/quests/PlayerListener.java b/src/me/blackvein/quests/PlayerListener.java index 46418aff0..7322db18b 100644 --- a/src/me/blackvein/quests/PlayerListener.java +++ b/src/me/blackvein/quests/PlayerListener.java @@ -2,7 +2,6 @@ package me.blackvein.quests; import java.io.File; import org.bukkit.ChatColor; -import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -104,7 +103,7 @@ public class PlayerListener implements Listener { plugin.questFactory.selectedReachLocations.put(evt.getPlayer(), block); evt.getPlayer().sendMessage(ChatColor.GOLD + "Selected location " + ChatColor.AQUA + loc.getWorld().getName() + ": " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ() + ChatColor.GOLD + " (" + ChatColor.GREEN + Quester.prettyItemString(block.getType().getId()) + ChatColor.GOLD + ")"); - }else { + }else if(player.isConversing() == false){ for (final Quest q : plugin.quests) { diff --git a/src/me/blackvein/quests/Quest.java b/src/me/blackvein/quests/Quest.java index e315f419f..50a5e10b1 100644 --- a/src/me/blackvein/quests/Quest.java +++ b/src/me/blackvein/quests/Quest.java @@ -1,43 +1,40 @@ package me.blackvein.quests; -import java.util.EnumMap; import java.util.LinkedList; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import me.blackvein.quests.util.ItemUtil; import net.citizensnpcs.api.npc.NPC; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; public class Quest { - String name; - String description; - String finished; - int redoDelay = -1; + public String name; + public String description; + public String finished; + public long redoDelay = -1; + public int parties = 0; LinkedList stages = new LinkedList(); NPC npcStart; Location blockStart; Quests plugin; - Map questItems = new EnumMap(Material.class); + Event initialEvent; //Requirements int moneyReq = 0; int questPointsReq = 0; - List itemIds = new LinkedList(); - List itemAmounts = new LinkedList(); + List items = new LinkedList(); List removeItems = new LinkedList(); List neededQuests = new LinkedList(); List permissionReqs = new LinkedList(); - String failRequirements; + public String failRequirements = null; // //Rewards @@ -79,21 +76,6 @@ public class Quest { q.currentStage = stages.get(stages.indexOf(q.currentStage) + 1); q.addEmpties(); - for (Entry e : q.currentStage.itemsToCraft.entrySet()) { - - if ((Boolean) e.getValue() == true) { - - Map tempMap = (Map) e.getKey(); - for (Entry e2 : tempMap.entrySet()) { - - questItems.put((Material) e2.getKey(), (Integer) e2.getValue()); - - } - - } - - } - player.sendMessage(ChatColor.GOLD + "---(Objectives)---"); for(String s : q.getObjectives()){ @@ -118,6 +100,10 @@ public class Quest { return name; } + public boolean testRequirements(Quester quester){ + return testRequirements(quester.getPlayer()); + } + public boolean testRequirements(Player player){ Quester quester = plugin.getQuester(player.getName()); @@ -128,18 +114,18 @@ public class Quest { PlayerInventory inventory = player.getInventory(); int num = 0; - for(int i : itemIds){ + for(ItemStack is : items){ for(ItemStack stack : inventory.getContents()){ if(stack != null){ - if(i == stack.getTypeId()) + if(ItemUtil.compareItems(is, stack, true) == 0) num += stack.getAmount(); } } - if(num < itemAmounts.get(itemIds.indexOf(i))) + if(num < is.getAmount()) return false; num = 0; @@ -182,38 +168,6 @@ public class Quest { none = null; } - for(Entry entry : questItems.entrySet()){ - - Material material = (Material) entry.getKey(); - int amount = (Integer) entry.getValue(); - for(ItemStack stack : player.getInventory().getContents()){ - - if(stack != null){ - - if(stack.getType().equals(material)){ - - if(stack.getAmount() > amount){ - - stack.setAmount(stack.getAmount() - amount); - break; - - }else{ - - amount -= stack.getAmount(); - stack.setAmount(0); - if(amount == 0) - break; - - } - - } - - } - - } - - } - for(String s : commands){ s = s.replaceAll("", player.getName()); @@ -252,7 +206,13 @@ public class Quest { } for(ItemStack i : itemRewards){ - player.sendMessage("- " + ChatColor.DARK_GREEN + i.getItemMeta().getDisplayName() + ChatColor.GRAY + " x " + i.getAmount()); + if(i.hasItemMeta() && i.getItemMeta().hasDisplayName()) + player.sendMessage("- " + ChatColor.DARK_AQUA + ChatColor.ITALIC + i.getItemMeta().getDisplayName() + ChatColor.RESET + ChatColor.GRAY + " x " + i.getAmount()); + else if(i.getDurability() != 0) + player.sendMessage("- " + ChatColor.DARK_GREEN + Quester.prettyItemString(i.getTypeId()) + ":" + i.getDurability() + ChatColor.GRAY + " x " + i.getAmount()); + else + player.sendMessage("- " + ChatColor.DARK_GREEN + Quester.prettyItemString(i.getTypeId()) + ChatColor.GRAY + " x " + i.getAmount()); + none = null; } @@ -297,14 +257,28 @@ public class Quest { for(String s : other.commands){ - if(commands.get(other.commands.indexOf(s)).equals(s) == false) + if(commands.size() >= (other.commands.indexOf(s))){ + + if(commands.get(other.commands.indexOf(s)).equals(s) == false) + return false; + + }else{ return false; + } } if(other.description.equals(description) == false) return false; + if(other.initialEvent != null && initialEvent != null){ + if(other.initialEvent.equals(initialEvent) == false) + return false; + }else if(other.initialEvent != null && initialEvent == null){ + return false; + }else if(other.initialEvent == null && initialEvent != null) + return false; + if(other.exp != exp) return false; @@ -319,10 +293,7 @@ public class Quest { if(other.finished.equals(finished) == false) return false; - if(other.itemAmounts.equals(itemAmounts) == false) - return false; - - if(other.itemIds.equals(itemIds) == false) + if(other.items.equals(items) == false) return false; if(other.itemRewards.equals(itemRewards) == false) @@ -360,9 +331,6 @@ public class Quest { if(other.permissions.equals(permissions) == false) return false; - if(other.questItems.equals(questItems) == false) - return false; - if(other.questPoints != questPoints) return false; diff --git a/src/me/blackvein/quests/QuestFactory.java b/src/me/blackvein/quests/QuestFactory.java index 8c32fe069..b26273da0 100644 --- a/src/me/blackvein/quests/QuestFactory.java +++ b/src/me/blackvein/quests/QuestFactory.java @@ -5,19 +5,28 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import me.blackvein.quests.prompts.RequirementsPrompt; import me.blackvein.quests.prompts.RewardsPrompt; import me.blackvein.quests.prompts.StagesPrompt; +import me.blackvein.quests.util.ItemUtil; +import me.blackvein.quests.util.Lang; +import net.citizensnpcs.api.npc.NPC; import org.bukkit.ChatColor; +import org.bukkit.DyeColor; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.conversations.*; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; -public class QuestFactory implements ConversationAbandonedListener { +public class QuestFactory implements ConversationAbandonedListener, ColorUtil { public Quests quests; Map editSessions = new HashMap(); @@ -26,17 +35,6 @@ public class QuestFactory implements ConversationAbandonedListener { public Map selectedReachLocations = new HashMap(); public List names = new LinkedList(); ConversationFactory convoCreator; - static final ChatColor BOLD = ChatColor.BOLD; - static final ChatColor AQUA = ChatColor.AQUA; - static final ChatColor DARKAQUA = ChatColor.DARK_AQUA; - static final ChatColor BLUE = ChatColor.BLUE; - static final ChatColor GOLD = ChatColor.GOLD; - static final ChatColor PINK = ChatColor.LIGHT_PURPLE; - static final ChatColor GREEN = ChatColor.GREEN; - static final ChatColor RED = ChatColor.RED; - static final ChatColor DARKRED = ChatColor.DARK_RED; - static final ChatColor YELLOW = ChatColor.YELLOW; - static final ChatColor RESET = ChatColor.RESET; File questsFile; @SuppressWarnings("LeakingThisInConstructor") @@ -49,8 +47,7 @@ public class QuestFactory implements ConversationAbandonedListener { this.convoCreator = new ConversationFactory(plugin) .withModality(false) .withLocalEcho(false) - .withPrefix(new QuestCreatorPrefix()) - .withFirstPrompt(new QuestNamePrompt()) + .withFirstPrompt(new MenuPrompt()) .withTimeout(3600) .thatExcludesNonPlayersWithMessage("Console may not perform this operation!") .addConversationAbandonedListener(this); @@ -71,21 +68,11 @@ public class QuestFactory implements ConversationAbandonedListener { } - private class QuestCreatorPrefix implements ConversationPrefix { - - @Override - public String getPrefix(ConversationContext context) { - - return ""; - - } - } - private class MenuPrompt extends FixedSetPrompt { public MenuPrompt() { - super("1", "2", "3"); + super("1", "2", "3", "4"); } @@ -96,7 +83,9 @@ public class QuestFactory implements ConversationAbandonedListener { GOLD + "- Quest Editor -\n" + BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Create a Quest\n" + BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Edit a Quest\n" - + BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Delete a Quest"; + + BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Delete a Quest\n" + + GOLD + "" + BOLD + "4" + RESET + YELLOW + " - Exit"; + return text; @@ -105,8 +94,38 @@ public class QuestFactory implements ConversationAbandonedListener { @Override protected Prompt acceptValidatedInput(ConversationContext context, String input) { + final Player player = (Player) context.getForWhom(); + if (input.equalsIgnoreCase("1")) { - return new QuestNamePrompt(); + + if (player.hasPermission("quests.editor.create")) { + return new QuestNamePrompt(); + } else { + player.sendMessage(RED + "You do not have permission to create Quests."); + return new MenuPrompt(); + } + + } else if (input.equalsIgnoreCase("2")) { + + if (player.hasPermission("quests.editor.edit")) { + return new SelectEditPrompt(); + } else { + player.sendMessage(RED + "You do not have permission to edit Quests."); + return new MenuPrompt(); + } + + } else if (input.equalsIgnoreCase("3")) { + + if (player.hasPermission("quests.editor.delete")) { + return new SelectDeletePrompt(); + } else { + player.sendMessage(RED + "You do not have permission to delete Quests."); + return new MenuPrompt(); + } + + } else if (input.equalsIgnoreCase("4")) { + context.getForWhom().sendRawMessage(YELLOW + "Exited."); + return Prompt.END_OF_CONVERSATION; } return null; @@ -124,7 +143,7 @@ public class QuestFactory implements ConversationAbandonedListener { public CreateMenuPrompt() { - super("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"); + super("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"); } @@ -142,16 +161,26 @@ public class QuestFactory implements ConversationAbandonedListener { text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set ask message (\"" + context.getSessionData("askMessage") + "\")\n"; } + if (context.getSessionData("finishMessage") == null) { text += BLUE + "" + BOLD + "3" + RESET + RED + " - Set finish message " + DARKRED + "(Required, none set)\n"; } else { text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set finish message (\"" + context.getSessionData("finishMessage") + "\")\n"; } + if (context.getSessionData("redoDelay") == null) { text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set redo delay (None set)\n"; } else { - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set redo delay (" + Quests.getTime((Long) context.getSessionData("redoDelay")) + ")\n"; + + //something here is throwing an exception + try{ + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set redo delay (" + Quests.getTime((Long) context.getSessionData("redoDelay")) + ")\n"; + }catch(Exception e){ + e.printStackTrace(); + } + + // } if (context.getSessionData("npcStart") == null && quests.citizens != null) { @@ -180,36 +209,60 @@ public class QuestFactory implements ConversationAbandonedListener { } + + if (context.getSessionData("initialEvent") == null) { + + if (quests.citizens != null) { + text += BLUE + "" + BOLD + "7" + RESET + YELLOW + " - Set initial Event (None set)\n"; + } else { + text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - Set initial Event (None set)\n"; + } + + } else { + + if (quests.citizens != null) { + String s = (String) context.getSessionData("initialEvent"); + text += BLUE + "" + BOLD + "7" + RESET + YELLOW + " - Set initial Event (" + s + ")\n"; + } else { + String s = (String) context.getSessionData("initialEvent"); + text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - Set initial Event (" + s + ")\n"; + } + + } + if (quests.citizens != null) { + text += BLUE + "" + BOLD + "8" + RESET + DARKAQUA + " - Edit Requirements\n"; + } else { text += BLUE + "" + BOLD + "7" + RESET + DARKAQUA + " - Edit Requirements\n"; - } else { - text += BLUE + "" + BOLD + "6" + RESET + DARKAQUA + " - Edit Requirements\n"; } + if (quests.citizens != null) { + text += BLUE + "" + BOLD + "9" + RESET + PINK + " - Edit Stages\n"; + } else { text += BLUE + "" + BOLD + "8" + RESET + PINK + " - Edit Stages\n"; - } else { - text += BLUE + "" + BOLD + "7" + RESET + PINK + " - Edit Stages\n"; } if (quests.citizens != null) { + text += BLUE + "" + BOLD + "10" + RESET + GREEN + " - Edit Rewards\n"; + } else { text += BLUE + "" + BOLD + "9" + RESET + GREEN + " - Edit Rewards\n"; - } else { - text += BLUE + "" + BOLD + "8" + RESET + GREEN + " - Edit Rewards\n"; } + if (quests.citizens != null) { + text += BLUE + "" + BOLD + "11" + RESET + GOLD + " - Save\n"; + } else { text += BLUE + "" + BOLD + "10" + RESET + GOLD + " - Save\n"; - } else { - text += BLUE + "" + BOLD + "9" + RESET + GOLD + " - Save\n"; } if (quests.citizens != null) { - text += BLUE + "" + BOLD + "11" + RESET + RED + " - Exit\n"; + text += BLUE + "" + BOLD + "12" + RESET + RED + " - Exit\n"; } else { - text += BLUE + "" + BOLD + "10" + RESET + RED + " - Exit\n"; + text += BLUE + "" + BOLD + "11" + RESET + RED + " - Exit\n"; } + return text; } @@ -251,15 +304,32 @@ public class QuestFactory implements ConversationAbandonedListener { return new RequirementsPrompt(quests, QuestFactory.this); } + } else if (input.equalsIgnoreCase("6")) { + + if (quests.citizens != null) { + selectedBlockStarts.put((Player) context.getForWhom(), null); + return new BlockStartPrompt(); + } else { + return new InitialEventPrompt(); + } + } else if (input.equalsIgnoreCase("7")) { + if (quests.citizens != null) { + return new InitialEventPrompt(); + } else { + return new RequirementsPrompt(quests, QuestFactory.this); + } + + } else if (input.equalsIgnoreCase("8")) { + if (quests.citizens != null) { return new RequirementsPrompt(quests, QuestFactory.this); } else { return new StagesPrompt(QuestFactory.this); } - } else if (input.equalsIgnoreCase("8")) { + } else if (input.equalsIgnoreCase("9")) { if (quests.citizens != null) { return new StagesPrompt(QuestFactory.this); @@ -267,7 +337,7 @@ public class QuestFactory implements ConversationAbandonedListener { return new RewardsPrompt(quests, QuestFactory.this); } - } else if (input.equalsIgnoreCase("9")) { + } else if (input.equalsIgnoreCase("10")) { if (quests.citizens != null) { return new RewardsPrompt(quests, QuestFactory.this); @@ -275,7 +345,7 @@ public class QuestFactory implements ConversationAbandonedListener { return new SavePrompt(); } - } else if (input.equalsIgnoreCase("10")) { + } else if (input.equalsIgnoreCase("11")) { if (quests.citizens != null) { return new SavePrompt(); @@ -283,7 +353,7 @@ public class QuestFactory implements ConversationAbandonedListener { return new ExitPrompt(); } - } else if (input.equalsIgnoreCase("11")) { + } else if (input.equalsIgnoreCase("12")) { if (quests.citizens != null) { return new ExitPrompt(); @@ -303,12 +373,12 @@ public class QuestFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String quests = GOLD + "- Quests -\n"; - for (Quest q : QuestFactory.this.quests.getQuests()) { - quests += GOLD + "- " + YELLOW + q.getName() + "\n"; + String s = GOLD + "- Edit Quest -\n"; + for (Quest q : quests.getQuests()) { + s += GRAY + "- " + YELLOW + q.getName() + "\n"; } - return quests + GOLD + "Enter a Quest to edit, or \"cancel\" to exit."; + return s + GOLD + "Enter a Quest to edit, or \"cancel\" to return."; } @@ -317,9 +387,11 @@ public class QuestFactory implements ConversationAbandonedListener { if (input.equalsIgnoreCase("cancel") == false) { - for (Quest q : QuestFactory.this.quests.getQuests()) { + for (Quest q : quests.getQuests()) { - if (q.getName().equalsIgnoreCase(input)) { + if (q.getName().equalsIgnoreCase(input) || q.getName().toLowerCase().contains(input.toLowerCase())) { + loadQuest(context, q); + return new CreateMenuPrompt(); } } @@ -327,7 +399,7 @@ public class QuestFactory implements ConversationAbandonedListener { return new SelectEditPrompt(); } else { - return Prompt.END_OF_CONVERSATION; + return new MenuPrompt(); } } @@ -338,8 +410,8 @@ public class QuestFactory implements ConversationAbandonedListener { @Override public String getPromptText(ConversationContext context) { - String text = - AQUA + "Create new Quest " + GOLD + "- Enter a name for the Quest (Or enter \'cancel\' to exit)"; + String text = GOLD + "- Create Quest -\n"; + text += AQUA + "Create new Quest " + GOLD + "- Enter a name for the Quest (Or enter \'cancel\' to return)"; return text; @@ -381,7 +453,7 @@ public class QuestFactory implements ConversationAbandonedListener { } else { - return Prompt.END_OF_CONVERSATION; + return new MenuPrompt(); } @@ -488,8 +560,15 @@ public class QuestFactory implements ConversationAbandonedListener { for (Quest q : quests.quests) { if (q.name.equalsIgnoreCase(input)) { - context.getForWhom().sendRawMessage(RED + "A Quest with that name already exists!"); - return new SetNamePrompt(); + String s = null; + if (context.getSessionData("edit") != null) { + s = (String) context.getSessionData("edit"); + } + + if (s != null && s.equalsIgnoreCase(input) == false) { + context.getForWhom().sendRawMessage(RED + "A Quest with that name already exists!"); + return new SetNamePrompt(); + } } } @@ -559,6 +638,61 @@ public class QuestFactory implements ConversationAbandonedListener { } } + private class InitialEventPrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext context) { + + String text = DARKGREEN + "- Events -\n"; + if (quests.events.isEmpty()) { + text += RED + "- None"; + } else { + for (Event e : quests.events) { + text += GREEN + "- " + e.getName() + "\n"; + } + } + + return text + YELLOW + "Enter an Event name, or enter \"clear\" to clear the initial Event, or \"cancel\" to return"; + + } + + @Override + public Prompt acceptInput(ConversationContext context, String input) { + + Player player = (Player) context.getForWhom(); + + if (input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false) { + + Event found = null; + + for (Event e : quests.events) { + + if (e.getName().equalsIgnoreCase(input)) { + found = e; + break; + } + + } + + if (found == null) { + player.sendMessage(RED + input + YELLOW + " is not a valid event name!"); + return new InitialEventPrompt(); + } else { + context.setSessionData("initialEvent", found.getName()); + return new CreateMenuPrompt(); + } + + } else if (input.equalsIgnoreCase("clear")) { + context.setSessionData("initialEvent", null); + player.sendMessage(YELLOW + "Initial Event cleared."); + return new CreateMenuPrompt(); + } else { + return new CreateMenuPrompt(); + } + + } + } + private class RedoDelayPrompt extends NumericPrompt { @Override @@ -679,17 +813,40 @@ public class QuestFactory implements ConversationAbandonedListener { public static void saveQuest(ConversationContext cc, ConfigurationSection cs) { + String edit = null; + if (cc.getSessionData("edit") != null) { + edit = (String) cc.getSessionData("edit"); + } + + if (edit != null) { + + ConfigurationSection questList = cs.getParent(); + + for (String key : questList.getKeys(false)) { + + String name = questList.getString(key + ".name"); + if (name.equalsIgnoreCase(edit)) { + + questList.set(key, null); + break; + + } + + } + + } + String name = (String) cc.getSessionData("questName"); String desc = (String) cc.getSessionData("askMessage"); String finish = (String) cc.getSessionData("finishMessage"); Long redo = null; Integer npcStart = null; String blockStart = null; + String initialEvent = null; Integer moneyReq = null; Integer questPointsReq = null; - LinkedList itemIdReqs = null; - LinkedList itemAmountReqs = null; + LinkedList itemReqs = null; LinkedList removeItemReqs = null; LinkedList permReqs = null; LinkedList questReqs = null; @@ -697,8 +854,7 @@ public class QuestFactory implements ConversationAbandonedListener { Integer moneyRew = null; Integer questPointsRew = null; - LinkedList itemIdRews = null; - LinkedList itemAmountRews = null; + LinkedList itemRews = new LinkedList(); Integer expRew = null; LinkedList commandRews = null; LinkedList permRews = null; @@ -716,7 +872,7 @@ public class QuestFactory implements ConversationAbandonedListener { } if (cc.getSessionData("blockStart") != null) { - blockStart = (String) cc.getSessionData("blockStart"); + blockStart = Quests.getLocationInfo((Location) cc.getSessionData("blockStart")); } @@ -729,9 +885,8 @@ public class QuestFactory implements ConversationAbandonedListener { questPointsReq = (Integer) cc.getSessionData("questPointsReq"); } - if (cc.getSessionData("itemIdReqs") != null) { - itemIdReqs = (LinkedList) cc.getSessionData("itemIdReqs"); - itemAmountReqs = (LinkedList) cc.getSessionData("itemAmountReqs"); + if (cc.getSessionData("itemReqs") != null) { + itemReqs = (LinkedList) cc.getSessionData("itemReqs"); removeItemReqs = (LinkedList) cc.getSessionData("removeItemReqs"); } @@ -747,7 +902,9 @@ public class QuestFactory implements ConversationAbandonedListener { failMessage = (String) cc.getSessionData("failMessage"); } - + if (cc.getSessionData("initialEvent") != null) { + initialEvent = (String) cc.getSessionData("initialEvent"); + } if (cc.getSessionData("moneyRew") != null) { moneyRew = (Integer) cc.getSessionData("moneyRew"); @@ -757,9 +914,10 @@ public class QuestFactory implements ConversationAbandonedListener { questPointsRew = (Integer) cc.getSessionData("questPointsRew"); } - if (cc.getSessionData("itemIdRews") != null) { - itemIdRews = (LinkedList) cc.getSessionData("itemIdRews"); - itemAmountRews = (LinkedList) cc.getSessionData("itemAmountRews"); + if (cc.getSessionData("itemRews") != null) { + for (ItemStack is : (LinkedList) cc.getSessionData("itemRews")) { + itemRews.add(ItemUtil.serialize(is)); + } } if (cc.getSessionData("expRew") != null) { @@ -787,20 +945,30 @@ public class QuestFactory implements ConversationAbandonedListener { cs.set("redo-delay", redo); cs.set("ask-message", desc); cs.set("finish-message", finish); + cs.set("event", initialEvent); - if (moneyReq != null || questPointsReq != null || itemIdReqs != null || permReqs != null || questReqs != null) { + if (moneyReq != null || questPointsReq != null || itemReqs != null && itemReqs.isEmpty() == false || permReqs != null && permReqs.isEmpty() == false || questReqs != null && questReqs.isEmpty() == false) { ConfigurationSection reqs = cs.createSection("requirements"); - reqs.set("item-ids", itemIdReqs); - reqs.set("item-amounts", itemAmountReqs); + List items = new LinkedList(); + if(itemReqs != null){ + + for (ItemStack is : itemReqs) { + items.add(ItemUtil.serialize(is)); + } + + } + reqs.set("items", items); + reqs.set("remove-items", removeItemReqs); reqs.set("money", moneyReq); reqs.set("quest-points", questPointsReq); - reqs.set("remove-items", removeItemReqs); reqs.set("permissions", permReqs); reqs.set("quests", questReqs); reqs.set("fail-requirement-message", failMessage); + } else { + cs.set("requirements", null); } @@ -831,12 +999,17 @@ public class QuestFactory implements ConversationAbandonedListener { LinkedList enchantmentIds; LinkedList enchantmentAmounts; - LinkedList deliveryItemIds; - LinkedList deliveryItemAmounts; + LinkedList deliveryItems; LinkedList deliveryNPCIds; LinkedList deliveryMessages; - LinkedList npcIds; + LinkedList npcTalkIds; + + LinkedList npcKillIds; + LinkedList npcKillAmounts; + + LinkedList bossIds; + LinkedList bossAmounts; LinkedList mobs; LinkedList mobAmounts; @@ -862,7 +1035,7 @@ public class QuestFactory implements ConversationAbandonedListener { for (int i = 1; i <= StagesPrompt.getStages(cc); i++) { pref = "stage" + i; - ConfigurationSection stage = ordered.createSection("\'" + i + "\'"); + ConfigurationSection stage = ordered.createSection("" + i); breakIds = null; breakAmounts = null; @@ -886,12 +1059,17 @@ public class QuestFactory implements ConversationAbandonedListener { enchantmentIds = null; enchantmentAmounts = null; - deliveryItemIds = null; - deliveryItemAmounts = null; + deliveryItems = null; deliveryNPCIds = null; deliveryMessages = null; - npcIds = null; + npcTalkIds = null; + + npcKillIds = null; + npcKillAmounts = null; + + bossIds = null; + bossAmounts = null; mobs = null; mobAmounts = null; @@ -955,15 +1133,24 @@ public class QuestFactory implements ConversationAbandonedListener { enchantmentAmounts = (LinkedList) cc.getSessionData(pref + "enchantAmounts"); } - if (cc.getSessionData(pref + "deliveryIds") != null) { - deliveryItemIds = (LinkedList) cc.getSessionData(pref + "deliveryIds"); - deliveryItemAmounts = (LinkedList) cc.getSessionData(pref + "deliveryAmounts"); + if (cc.getSessionData(pref + "deliveryItems") != null) { + deliveryItems = (LinkedList) cc.getSessionData(pref + "deliveryItems"); deliveryNPCIds = (LinkedList) cc.getSessionData(pref + "deliveryNPCs"); deliveryMessages = (LinkedList) cc.getSessionData(pref + "deliveryMessages"); } if (cc.getSessionData(pref + "npcIdsToTalkTo") != null) { - npcIds = (LinkedList) cc.getSessionData(pref + "npcIdsToTalkTo"); + npcTalkIds = (LinkedList) cc.getSessionData(pref + "npcIdsToTalkTo"); + } + + if (cc.getSessionData(pref + "npcIdsToKill") != null) { + npcKillIds = (LinkedList) cc.getSessionData(pref + "npcIdsToKill"); + npcKillAmounts = (LinkedList) cc.getSessionData(pref + "npcAmountsToKill"); + } + + if (cc.getSessionData(pref + "bossIds") != null) { + bossIds = (LinkedList) cc.getSessionData(pref + "bossIds"); + bossAmounts = (LinkedList) cc.getSessionData(pref + "bossAmounts"); } if (cc.getSessionData(pref + "mobTypes") != null) { @@ -999,26 +1186,51 @@ public class QuestFactory implements ConversationAbandonedListener { script = (String) cc.getSessionData(pref + "denizen"); } - stage.set("break-block-ids", breakIds); - stage.set("break-block-amounts", breakAmounts); - stage.set("damage-block-ids", damageIds); - stage.set("damage-block-amounts", damageAmounts); - stage.set("place-block-ids", placeIds); - stage.set("place-block-amounts", placeAmounts); - stage.set("use-block-ids", useIds); - stage.set("use-block-amounts", useAmounts); - stage.set("cut-block-ids", cutIds); - stage.set("cut-block-amounts", cutAmounts); + if (breakIds != null && breakIds.isEmpty() == false) { + stage.set("break-block-ids", breakIds); + stage.set("break-block-amounts", breakAmounts); + } + + if (damageIds != null && damageIds.isEmpty() == false) { + stage.set("damage-block-ids", damageIds); + stage.set("damage-block-amounts", damageAmounts); + } + + if (placeIds != null && placeIds.isEmpty() == false) { + stage.set("place-block-ids", placeIds); + stage.set("place-block-amounts", placeAmounts); + } + + if (useIds != null && useIds.isEmpty() == false) { + stage.set("use-block-ids", useIds); + stage.set("use-block-amounts", useAmounts); + } + + if (cutIds != null && cutIds.isEmpty() == false) { + stage.set("cut-block-ids", cutIds); + stage.set("cut-block-amounts", cutAmounts); + } + stage.set("fish-to-catch", fish); stage.set("players-to-kill", players); stage.set("enchantments", enchantments); stage.set("enchantment-item-ids", enchantmentIds); stage.set("enchantment-amounts", enchantmentAmounts); - stage.set("item-ids-to-deliver", deliveryItemIds); - stage.set("item-amounts-to-deliver", deliveryItemAmounts); + if(deliveryItems != null && deliveryItems.isEmpty() == false){ + LinkedList items = new LinkedList(); + for(ItemStack is : deliveryItems) + items.add(ItemUtil.serialize(is)); + stage.set("items-to-deliver", items); + }else{ + stage.set("items-to-deliver", null); + } stage.set("npc-delivery-ids", deliveryNPCIds); stage.set("delivery-messages", deliveryMessages); - stage.set("npc-ids-to-talk-to", npcIds); + stage.set("npc-ids-to-talk-to", npcTalkIds); + stage.set("npc-ids-to-kill", npcKillIds); + stage.set("npc-kill-amounts", npcKillAmounts); + stage.set("boss-ids-to-kill", bossIds); + stage.set("boss-amounts-to-kill", bossAmounts); stage.set("mobs-to-kill", mobs); stage.set("mob-amounts", mobAmounts); stage.set("locations-to-kill", mobLocs); @@ -1039,11 +1251,10 @@ public class QuestFactory implements ConversationAbandonedListener { } - if (moneyRew != null || questPointsRew != null || itemIdRews != null || permRews != null || expRew != null || commandRews != null || mcMMOSkillRews != null) { + if (moneyRew != null || questPointsRew != null || itemRews != null && itemRews.isEmpty() == false || permRews != null && permRews.isEmpty() == false || expRew != null || commandRews != null && commandRews.isEmpty() == false || mcMMOSkillRews != null) { ConfigurationSection rews = cs.createSection("rewards"); - rews.set("item-ids", itemIdRews); - rews.set("item-amounts", itemAmountRews); + rews.set("items", itemRews); rews.set("money", moneyRew); rews.set("quest-points", questPointsRew); rews.set("exp", expRew); @@ -1052,86 +1263,486 @@ public class QuestFactory implements ConversationAbandonedListener { rews.set("mcmmo-skills", mcMMOSkillRews); rews.set("mcmmo-levels", mcMMOSkillAmounts); + } else { + cs.set("rewards", null); } } - /*public static void loadQuest(ConversationContext cc, Quest q) { + public static void loadQuest(ConversationContext cc, Quest q) { - cc.setSessionData("name", q.name); - cc.setSessionData("npc-giver-id", q.npcStart); - cc.setSessionData("block-start", q.blockStart); - cc.setSessionData("redo-delay", q.redoDelay); - cc.setSessionData("ask-message", q.description); - cc.setSessionData("finish-message", q.finished); + cc.setSessionData("edit", q.name); + cc.setSessionData("questName", q.name); + if (q.npcStart != null) { + cc.setSessionData("npcStart", q.npcStart.getId()); + } + cc.setSessionData("blockStart", q.blockStart); + if (q.redoDelay != -1) { + cc.setSessionData("redoDelay", q.redoDelay); + } + cc.setSessionData("askMessage", q.description); + cc.setSessionData("finishMessage", q.finished); + if (q.initialEvent != null) { + cc.setSessionData("initialEvent", q.initialEvent.getName()); + } + + //Requirements + if (q.moneyReq != 0) { + cc.setSessionData("moneyReq", q.moneyReq); + } + if (q.questPointsReq != 0) { + cc.setSessionData("questPointsReq", q.questPointsReq); + } + + if (q.items.isEmpty() == false) { + + cc.setSessionData("itemReqs", q.items); + cc.setSessionData("removeItemReqs", q.removeItems); + + } + + if (q.neededQuests.isEmpty() == false) { + cc.setSessionData("questReqs", q.neededQuests); + } + + if (q.permissionReqs.isEmpty() == false) { + cc.setSessionData("permissionReqs", q.permissionReqs); + } + + if (q.failRequirements != null) { + cc.setSessionData("failMessage", q.failRequirements); + } + // + + //Rewards + if (q.moneyReward != 0) { + cc.setSessionData("moneyRew", q.moneyReward); + } + + if (q.questPoints != 0) { + cc.setSessionData("questPointsRew", q.questPoints); + } + + if (q.exp != 0) { + cc.setSessionData("expRew", q.exp); + } + + if (q.commands.isEmpty() == false) { + cc.setSessionData("commandRews", q.commands); + } + + if (q.permissions.isEmpty() == false) { + cc.setSessionData("permissionRews", q.permissions); + } + + if (q.mcmmoSkills.isEmpty() == false) { + cc.setSessionData("mcMMOSkillRews", q.mcmmoSkills); + cc.setSessionData("mcMMOSkillAmounts", q.mcmmoAmounts); + } + // + + //Stages + for (Stage stage : q.stages) { + final String pref = "stage" + (q.stages.indexOf(stage) + 1); + cc.setSessionData(pref, Boolean.TRUE); + + if (stage.blocksToBreak != null) { + + LinkedList ids = new LinkedList(); + LinkedList amnts = new LinkedList(); + + for (Entry e : stage.blocksToBreak.entrySet()) { + + ids.add(((Material) e.getKey()).getId()); + amnts.add((Integer) e.getValue()); + + } + + cc.setSessionData(pref + "breakIds", ids); + cc.setSessionData(pref + "breakAmounts", amnts); + + } - cc.setSessionData(pref + "item-ids", itemIdReqs); - cc.setSessionData(pref + "item-amounts", itemAmountReqs); - cc.setSessionData(pref + "money", moneyReq); - cc.setSessionData(pref + "quest-points", questPointsReq); - cc.setSessionData(pref + "remove-items", removeItemReqs); - cc.setSessionData(pref + "permissions", permReqs); - cc.setSessionData(pref + "quests", questReqs); - cc.setSessionData(pref + "fail-requirement-message", failMessage); - cc.setSessionData(pref + "item-ids", itemIdRews); - cc.setSessionData(pref + "item-amounts", itemAmountRews); - cc.setSessionData(pref + "money", moneyRew); - cc.setSessionData(pref + "quest-points", questPointsRew); - cc.setSessionData(pref + "exp", expRew); - cc.setSessionData(pref + "permissions", permRews); - cc.setSessionData(pref + "commands", commandRews); - cc.setSessionData(pref + "mcmmo-skills", mcMMOSkillRews); - cc.setSessionData(pref + "mcmmo-levels", mcMMOSkillAmounts); + if (stage.blocksToDamage != null) { - String pref; + LinkedList ids = new LinkedList(); + LinkedList amnts = new LinkedList(); - for(Stage s : q.stages){ + for (Entry e : stage.blocksToDamage.entrySet()) { - pref = "stage" + q.stages.indexOf(s); + ids.add(((Material) e.getKey()).getId()); + amnts.add((Integer) e.getValue()); + + } + + cc.setSessionData(pref + "damageIds", ids); + cc.setSessionData(pref + "damageAmounts", amnts); + + } - cc.setSessionData("breakIds", breakIds); - cc.setSessionData("break-block-amounts", breakAmounts); - cc.setSessionData("damage-block-ids", damageIds); - cc.setSessionData("damage-block-amounts", damageAmounts); - cc.setSessionData("place-block-ids", placeIds); - cc.setSessionData("place-block-amounts", placeAmounts); - cc.setSessionData("use-block-ids", useIds); - cc.setSessionData("use-block-amounts", useAmounts); - cc.setSessionData("cut-block-ids", cutIds); - cc.setSessionData("cut-block-amounts", cutAmounts); - cc.setSessionData("fish-to-catch", fish); - cc.setSessionData("players-to-kill", players); - cc.setSessionData("enchantments", enchantments); - cc.setSessionData("enchantment-item-ids", enchantmentIds); - cc.setSessionData("enchantment-amounts", enchantmentAmounts); - cc.setSessionData("item-ids-to-deliver", deliveryItemIds); - cc.setSessionData("item-amounts-to-deliver", deliveryItemAmounts); - cc.setSessionData("npc-delivery-ids", deliveryNPCIds); - cc.setSessionData("delivery-messages", deliveryMessages); - cc.setSessionData("npc-ids-to-talk-to", npcIds); - cc.setSessionData("mobs-to-kill", mobs); - cc.setSessionData("mob-amounts", mobAmounts); - cc.setSessionData("locations-to-kill", mobLocs); - cc.setSessionData("kill-location-radii", mobRadii); - cc.setSessionData("kill-location-names", mobLocNames); - cc.setSessionData("locations-to-reach", reachLocs); - cc.setSessionData("reach-location-radii", reachRadii); - cc.setSessionData("reach-location-names", reachNames); - cc.setSessionData("mobs-to-tame", tames); - cc.setSessionData("mob-tame-amounts", tameAmounts); - cc.setSessionData("sheep-to-shear", shearColors); - cc.setSessionData("sheep-amounts", shearAmounts); - cc.setSessionData("script-to-run", script); - cc.setSessionData("event", event); - cc.setSessionData("delay", delay); - cc.setSessionData("delay-message", delayMessage); + if (stage.blocksToPlace != null) { + + LinkedList ids = new LinkedList(); + LinkedList amnts = new LinkedList(); + + for (Entry e : stage.blocksToPlace.entrySet()) { + + ids.add(((Material) e.getKey()).getId()); + amnts.add((Integer) e.getValue()); + + } + + cc.setSessionData(pref + "placeIds", ids); + cc.setSessionData(pref + "placeAmounts", amnts); + + } + + if (stage.blocksToUse != null) { + + LinkedList ids = new LinkedList(); + LinkedList amnts = new LinkedList(); + + for (Entry e : stage.blocksToUse.entrySet()) { + + ids.add(((Material) e.getKey()).getId()); + amnts.add((Integer) e.getValue()); + + } + + cc.setSessionData(pref + "useIds", ids); + cc.setSessionData(pref + "useAmounts", amnts); + + } + + + if (stage.blocksToCut != null) { + + LinkedList ids = new LinkedList(); + LinkedList amnts = new LinkedList(); + + for (Entry e : stage.blocksToCut.entrySet()) { + + ids.add(((Material) e.getKey()).getId()); + amnts.add((Integer) e.getValue()); + + } + + cc.setSessionData(pref + "cutIds", ids); + cc.setSessionData(pref + "cutAmounts", amnts); + + } + + + if (stage.fishToCatch != null) { + cc.setSessionData(pref + "fish", stage.fishToCatch); + } + + + if (stage.playersToKill != null) { + cc.setSessionData(pref + "playerKill", stage.playersToKill); + } + + + if (stage.itemsToEnchant.isEmpty() == false) { + + LinkedList enchants = new LinkedList(); + LinkedList ids = new LinkedList(); + LinkedList amounts = new LinkedList(); + + for (Entry, Integer> e : stage.itemsToEnchant.entrySet()) { + + amounts.add(e.getValue()); + for (Entry e2 : e.getKey().entrySet()) { + + ids.add(e2.getValue().getId()); + enchants.add(Quester.prettyEnchantmentString(e2.getKey())); + + } + + } + + cc.setSessionData(pref + "enchantTypes", enchants); + cc.setSessionData(pref + "enchantIds", ids); + cc.setSessionData(pref + "enchantAmounts", amounts); + + } + + + if (stage.itemsToDeliver.isEmpty() == false) { + + LinkedList items = new LinkedList(); + LinkedList npcs = new LinkedList(); + + for (ItemStack is : stage.itemsToDeliver) { + items.add(is); + } + + for (NPC n : stage.itemDeliveryTargets) { + npcs.add(n.getId()); + } + + cc.setSessionData(pref + "deliveryItems", items); + cc.setSessionData(pref + "deliveryNPCs", npcs); + cc.setSessionData(pref + "deliveryMessages", stage.deliverMessages); + + } + + + if (stage.citizensToInteract.isEmpty() == false) { + + LinkedList npcs = new LinkedList(); + for (NPC n : stage.citizensToInteract) { + npcs.add(n.getId()); + } + + cc.setSessionData(pref + "npcIdsToTalkTo", npcs); + + } + + + if (stage.citizensToKill.isEmpty() == false) { + + LinkedList npcs = new LinkedList(); + for (NPC n : stage.citizensToKill) { + npcs.add(n.getId()); + } + + cc.setSessionData(pref + "npcIdsToKill", npcs); + cc.setSessionData(pref + "npcAmountsToKill", stage.citizenNumToKill); + + } + + + if (stage.bossesToKill.isEmpty() == false) { + + cc.setSessionData(pref + "bossIds", stage.bossesToKill); + cc.setSessionData(pref + "bossAmounts", stage.bossAmountsToKill); + + } + + + if (stage.mobsToKill.isEmpty() == false) { + + LinkedList mobs = new LinkedList(); + for (EntityType et : stage.mobsToKill) { + mobs.add(Quester.prettyMobString(et)); + } + + cc.setSessionData(pref + "mobTypes", mobs); + cc.setSessionData(pref + "mobAmounts", stage.mobNumToKill); + + if (stage.locationsToKillWithin.isEmpty() == false) { + + LinkedList locs = new LinkedList(); + for (Location l : stage.locationsToKillWithin) { + locs.add(Quests.getLocationInfo(l)); + } + + cc.setSessionData(pref + "killLocations", locs); + cc.setSessionData(pref + "killLocationRadii", stage.radiiToKillWithin); + cc.setSessionData(pref + "killLocationNames", stage.areaNames); + + } + + } + + + if (stage.locationsToReach.isEmpty() == false) { + + LinkedList locs = new LinkedList(); + for (Location l : stage.locationsToReach) { + locs.add(Quests.getLocationInfo(l)); + } + + cc.setSessionData(pref + "reachLocations", locs); + cc.setSessionData(pref + "reachLocationRadii", stage.radiiToReachWithin); + cc.setSessionData(pref + "reachLocationNames", stage.locationNames); + + } + + + if (stage.mobsToTame.isEmpty() == false) { + + LinkedList mobs = new LinkedList(); + LinkedList amnts = new LinkedList(); + + for (Entry e : stage.mobsToTame.entrySet()) { + + mobs.add(Quester.prettyMobString(e.getKey())); + amnts.add(e.getValue()); + + } + + cc.setSessionData(pref + "tameTypes", mobs); + cc.setSessionData(pref + "tameAmounts", amnts); + + } + + + if (stage.sheepToShear.isEmpty() == false) { + + LinkedList colors = new LinkedList(); + LinkedList amnts = new LinkedList(); + + for (Entry e : stage.sheepToShear.entrySet()) { + colors.add(Quester.prettyColorString(e.getKey())); + amnts.add(e.getValue()); + } + + cc.setSessionData(pref + "shearColors", colors); + cc.setSessionData(pref + "shearAmounts", amnts); + + } + + + if (stage.event != null) { + cc.setSessionData(pref + "event", stage.event.getName()); + } + + + if (stage.delay != -1) { + cc.setSessionData(pref + "delay", stage.delay); + if (stage.delayMessage != null) { + cc.setSessionData(pref + "delayMessage", stage.delayMessage); + } + } + + if (stage.script != null) { + cc.setSessionData(pref + "denizen", stage.script); + } + + } + // + + } + + private class SelectDeletePrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext context) { + + String text = GOLD + "- " + "Delete Quest" + " -\n"; + + for (Quest quest : quests.quests) { + text += AQUA + quest.name + YELLOW + ","; + } + + text = text.substring(0, text.length() - 1) + "\n"; + text += YELLOW + "Enter a Quest name, or \"cancel\" to return."; + + return text; + + } + + @Override + public Prompt acceptInput(ConversationContext context, String input) { + + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { + + LinkedList used = new LinkedList(); + + for (Quest quest : quests.quests) { + + if (quest.name.equalsIgnoreCase(input) || quest.name.toLowerCase().contains(input.toLowerCase())) { + + for (Quest q : quests.quests) { + + if (q.neededQuests.contains(q.name)) { + used.add(q.name); + } + + } + + if (used.isEmpty()) { + context.setSessionData("delQuest", quest.name); + return new DeletePrompt(); + } else { + ((Player) context.getForWhom()).sendMessage(RED + "The following Quests have \"" + PURPLE + context.getSessionData("delQuest") + RED + "\" as a requirement:"); + for (String s : used) { + ((Player) context.getForWhom()).sendMessage(RED + "- " + DARKRED + s); + } + ((Player) context.getForWhom()).sendMessage(RED + "You must modify these Quests so that they do not use it before deleting it."); + return new SelectDeletePrompt(); + } + } + + } + + ((Player) context.getForWhom()).sendMessage(RED + "Quest not found!"); + return new SelectDeletePrompt(); + + } else { + return new MenuPrompt(); + } + + } + } + + private class DeletePrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext context) { + + String text = + RED + "Are you sure you want to delete the Quest " + " \"" + GOLD + (String) context.getSessionData("delQuest") + RED + "\"?\n"; + text += YELLOW + Lang.get("yes") + "/" + Lang.get("no"); + + return text; + + } + + @Override + public Prompt acceptInput(ConversationContext context, String input) { + + if (input.equalsIgnoreCase(Lang.get("yes"))) { + deleteQuest(context); + return Prompt.END_OF_CONVERSATION; + } else if (input.equalsIgnoreCase(Lang.get("no"))) { + return new MenuPrompt(); + } else { + return new DeletePrompt(); + } + + } + } + + private void deleteQuest(ConversationContext context) { + + YamlConfiguration data = new YamlConfiguration(); + + try { + data.load(questsFile); + } catch (Exception e) { + e.printStackTrace(); + ((Player) context.getForWhom()).sendMessage(ChatColor.RED + "Error reading Quests file."); + return; + } + + String quest = (String) context.getSessionData("delQuest"); + ConfigurationSection sec = data.getConfigurationSection("quests"); + for (String key : sec.getKeys(false)) { + + if (sec.getString(key + ".name").equalsIgnoreCase(quest)) { + sec.set(key, null); + break; + } } + try { + data.save(questsFile); + } catch (Exception e) { + ((Player) context.getForWhom()).sendMessage(ChatColor.RED + "An error occurred while saving."); + return; + } - }*/ + quests.reloadQuests(); + context.getForWhom().sendRawMessage(WHITE + "" + BOLD + "Quest deleted! Quests and Events have been reloaded."); + + + } } diff --git a/src/me/blackvein/quests/Quester.java b/src/me/blackvein/quests/Quester.java index dbf682c62..0dc0136ce 100644 --- a/src/me/blackvein/quests/Quester.java +++ b/src/me/blackvein/quests/Quester.java @@ -3,6 +3,8 @@ package me.blackvein.quests; import java.io.File; import java.util.*; import java.util.Map.Entry; +import me.ThaH3lper.com.LoadBosses.LoadBoss; +import me.blackvein.quests.util.ItemUtil; import net.citizensnpcs.api.npc.NPC; import org.bukkit.ChatColor; import org.bukkit.DyeColor; @@ -24,12 +26,12 @@ public class Quester { boolean editorMode = false; boolean holdingQuestItemFromStorage = false; boolean delayOver = true; - Quest currentQuest; - String questToTake; + public Quest currentQuest; + public String questToTake; Stage currentStage; int questPoints = 0; Quests plugin; - LinkedList completedQuests = new LinkedList(); + public LinkedList completedQuests = new LinkedList(); Map completedTimes = new HashMap(); Map blocksDamaged = new EnumMap(Material.class); Map blocksBroken = new EnumMap(Material.class); @@ -37,7 +39,7 @@ public class Quester { Map blocksUsed = new EnumMap(Material.class); Map blocksCut = new EnumMap(Material.class); Map potionsBrewed = new HashMap(); - Map itemsDelivered = new EnumMap(Material.class); + Map itemsDelivered = new HashMap(); int fishCaught = 0; int playersKilled = 0; long delayStartTime = 0; @@ -51,12 +53,13 @@ public class Quester { Map citizensInteracted = new HashMap(); LinkedList citizensKilled = new LinkedList(); LinkedList citizenNumKilled = new LinkedList(); + LinkedList bossesKilled = new LinkedList(); + LinkedList bossAmountsKilled = new LinkedList(); LinkedList locationsReached = new LinkedList(); LinkedList hasReached = new LinkedList(); LinkedList radiiToReachWithin = new LinkedList(); Map mobsTamed = new EnumMap(EntityType.class); Map sheepSheared = new EnumMap(DyeColor.class); - Map itemsCrafted = new EnumMap(Material.class); final Random random = new Random(); public Quester(Quests newPlugin) { @@ -84,9 +87,9 @@ public class Quester { Quests.economy.withdrawPlayer(name, q.moneyReq); } - for (int i : q.itemIds) { - if (q.removeItems.get(q.itemIds.indexOf(i)) == true) { - Quests.removeItem(player.getInventory(), Material.getMaterial(i), q.itemAmounts.get(q.itemIds.indexOf(i))); + for (ItemStack is : q.items) { + if (q.removeItems.get(q.items.indexOf(is)) == true) { + Quests.removeItem(player.getInventory(), is); } } @@ -97,6 +100,9 @@ public class Quester { player.sendMessage(s); } + if(q.initialEvent != null) + q.initialEvent.happen(this); + } else { player.sendMessage(q.failRequirements); @@ -105,6 +111,19 @@ public class Quester { } + public Party getParty(){ + + for(Party p : plugin.parties){ + + if(p.getMember(name) != null) + return p; + + } + + return null; + + } + public LinkedList getObjectives() { LinkedList unfinishedObjectives = new LinkedList(); @@ -336,19 +355,19 @@ public class Quester { } - for (Material m : currentStage.itemsToDeliver) { + for (ItemStack is : currentStage.itemsToDeliver) { - int delivered = itemsDelivered.get(m); - int amt = currentStage.itemAmountsToDeliver.get(currentStage.itemsToDeliver.indexOf(m)); - NPC npc = currentStage.itemDeliveryTargets.get(currentStage.itemsToDeliver.indexOf(m)); + int delivered = itemsDelivered.get(is); + int amt = is.getAmount(); + NPC npc = currentStage.itemDeliveryTargets.get(currentStage.itemsToDeliver.indexOf(is)); if (delivered < amt) { - unfinishedObjectives.add(ChatColor.GREEN + "Deliver " + Quester.prettyItemString(m.getId()) + " to " + npc.getName() + ": " + delivered + "/" + amt); + unfinishedObjectives.add(ChatColor.GREEN + "Deliver " + ItemUtil.getName(is) + " to " + npc.getName() + ": " + delivered + "/" + amt); } else { - finishedObjectives.add(ChatColor.GRAY + "Deliver " + Quester.prettyItemString(m.getId()) + " to " + npc.getName() + ": " + delivered + "/" + amt); + finishedObjectives.add(ChatColor.GRAY + "Deliver " + ItemUtil.getName(is) + " to " + npc.getName() + ": " + delivered + "/" + amt); } @@ -395,6 +414,20 @@ public class Quester { } + for (String boss : currentStage.bossesToKill) { + + if (bossAmountsKilled.get(bossesKilled.indexOf(boss)) < currentStage.bossAmountsToKill.get(currentStage.bossesToKill.indexOf(boss))) { + + unfinishedObjectives.add(ChatColor.GREEN + "Kill " + ChatColor.ITALIC + boss + ChatColor.RESET + ChatColor.GREEN + " " + bossAmountsKilled.get(currentStage.bossesToKill.indexOf(boss)) + "/" + currentStage.bossAmountsToKill.get(currentStage.bossesToKill.indexOf(boss))); + + } else { + + unfinishedObjectives.add(ChatColor.GRAY + "Kill " + ChatColor.ITALIC + boss + ChatColor.RESET + ChatColor.GRAY + " " + currentStage.bossAmountsToKill.get(currentStage.bossesToKill.indexOf(boss)) + "/" + currentStage.bossAmountsToKill.get(currentStage.bossesToKill.indexOf(boss))); + + } + + } + for (Entry e : currentStage.mobsToTame.entrySet()) { for (Entry e2 : mobsTamed.entrySet()) { @@ -439,33 +472,6 @@ public class Quester { } - for (Entry e : currentStage.itemsToCraft.entrySet()) { - - Entry entry = null; - for (Object o : ((Map) e.getKey()).entrySet()) { - entry = (Entry) o; - } - - for (Entry e2 : itemsCrafted.entrySet()) { - - if (entry.getKey().equals(e2.getKey())) { - - if ((Integer) e2.getValue() < (Integer) entry.getValue()) { - - unfinishedObjectives.add(ChatColor.GREEN + "Craft " + prettyItemString(((Material) entry.getKey()).getId()) + ": " + ((Integer) e2.getValue()) + "/" + ((Integer) entry.getValue())); - - } else { - - finishedObjectives.add(ChatColor.GRAY + "Craft " + prettyItemString(((Material) entry.getKey()).getId()) + ": " + ((Integer) e2.getValue()) + "/" + ((Integer) entry.getValue())); - - } - - } - - } - - } - for (Location l : currentStage.locationsToReach) { for (Location l2 : locationsReached) { @@ -597,6 +603,14 @@ public class Quester { return true; } + } else if (s.equalsIgnoreCase("killBoss")) { + + if (currentStage.bossesToKill.isEmpty()) { + return false; + } else { + return true; + } + } else if (s.equalsIgnoreCase("tameMob")) { if (currentStage.mobsToTame.isEmpty()) { @@ -642,7 +656,7 @@ public class Quester { blocksDamaged.put(m, (i + 1)); if (blocksDamaged.get(m).equals(currentStage.blocksToDamage.get(m))) { - finishObjective("damageBlock", m, null, null, null, null, null, null, null, 0); + finishObjective("damageBlock", m, null, null, null, null, null, null, null, null); } } @@ -660,7 +674,7 @@ public class Quester { blocksBroken.put(m, (i + 1)); if (blocksBroken.get(m).equals(currentStage.blocksToBreak.get(m))) { - finishObjective("breakBlock", m, null, null, null, null, null, null, null, 0); + finishObjective("breakBlock", m, null, null, null, null, null, null, null, null); } } @@ -677,7 +691,7 @@ public class Quester { blocksPlaced.put(m, (i + 1)); if (blocksPlaced.get(m).equals(currentStage.blocksToPlace.get(m))) { - finishObjective("placeBlock", m, null, null, null, null, null, null, null, 0); + finishObjective("placeBlock", m, null, null, null, null, null, null, null, null); } } @@ -694,7 +708,7 @@ public class Quester { blocksUsed.put(m, (i + 1)); if (blocksUsed.get(m).equals(currentStage.blocksToUse.get(m))) { - finishObjective("useBlock", m, null, null, null, null, null, null, null, 0); + finishObjective("useBlock", m, null, null, null, null, null, null, null, null); } } @@ -712,7 +726,7 @@ public class Quester { blocksCut.put(m, (i + 1)); if (blocksCut.get(m).equals(currentStage.blocksToCut.get(m))) { - finishObjective("cutBlock", m, null, null, null, null, null, null, null, 0); + finishObjective("cutBlock", m, null, null, null, null, null, null, null, null); } } @@ -727,7 +741,7 @@ public class Quester { fishCaught++; if (((Integer) fishCaught).equals(currentStage.fishToCatch)) { - finishObjective("catchFish", null, null, null, null, null, null, null, null, 0); + finishObjective("catchFish", null, null, null, null, null, null, null, null, null); } } @@ -750,7 +764,7 @@ public class Quester { itemsEnchanted.put(((Map) entry.getKey()), (num)); if ((num).equals((Integer) entry2.getValue())) { - finishObjective("enchantItem", m, null, e, null, null, null, null, null, 0); + finishObjective("enchantItem", m, null, e, null, null, null, null, null, null); } } @@ -791,7 +805,7 @@ public class Quester { mobNumKilled.set(index, numKilledInteger); if ((numKilledInteger).equals(currentStage.mobNumToKill.get(index))) { - finishObjective("killMob", null, null, null, e, null, null, null, null, 0); + finishObjective("killMob", null, null, null, e, null, null, null, null, null); } } @@ -809,7 +823,7 @@ public class Quester { mobNumKilled.set(mobsKilled.indexOf(e), mobNumKilled.get(mobsKilled.indexOf(e)) + 1); if ((mobNumKilled.get(mobsKilled.indexOf(e))).equals(currentStage.mobNumToKill.get(mobsKilled.indexOf(e)))) { - finishObjective("killMob", null, null, null, e, null, null, null, null, 0); + finishObjective("killMob", null, null, null, e, null, null, null, null, null); } } @@ -843,7 +857,7 @@ public class Quester { playersKilled++; if (((Integer) playersKilled).equals(currentStage.playersToKill)) { - finishObjective("killPlayer", null, null, null, null, null, null, null, null, 0); + finishObjective("killPlayer", null, null, null, null, null, null, null, null, null); } } @@ -856,7 +870,7 @@ public class Quester { if (citizensInteracted.get(n) == false) { citizensInteracted.put(n, true); - finishObjective("talkToNPC", null, null, null, null, null, n, null, null, 0); + finishObjective("talkToNPC", null, null, null, null, null, n, null, null, null); } } @@ -871,7 +885,7 @@ public class Quester { if (citizenNumKilled.get(index) < currentStage.citizenNumToKill.get(index)) { citizenNumKilled.set(index, citizenNumKilled.get(index) + 1); if (citizenNumKilled.get(index) == currentStage.citizenNumToKill.get(index)) { - finishObjective("killNPC", null, null, null, null, null, n, null, null, 0); + finishObjective("killNPC", null, null, null, null, null, n, null, null, null); } } @@ -879,6 +893,26 @@ public class Quester { } + public void killBoss(String boss) { + + for(String s : bossesKilled){ + + if (s.equalsIgnoreCase(boss)) { + + int index = bossesKilled.indexOf(s); + if (bossAmountsKilled.get(index) < currentStage.bossAmountsToKill.get(index)) { + bossAmountsKilled.set(index, bossAmountsKilled.get(index) + 1); + if (bossAmountsKilled.get(index) == currentStage.bossAmountsToKill.get(index)) { + finishObjective("killBoss", null, null, null, null, null, null, null, null, boss); + } + } + + } + + } + + } + public void reachLocation(Location l) { for (Location location : locationsReached) { @@ -895,7 +929,7 @@ public class Quester { if (hasReached.get(index) == false) { hasReached.set(index, true); - finishObjective("reachLocation", null, null, null, null, null, null, location, null, 0); + finishObjective("reachLocation", null, null, null, null, null, null, location, null, null); } @@ -916,7 +950,7 @@ public class Quester { mobsTamed.put(entity, (mobsTamed.get(entity) + 1)); if (mobsTamed.get(entity).equals(currentStage.mobsToTame.get(entity))) { - finishObjective("tameMob", null, null, null, entity, null, null, null, null, 0); + finishObjective("tameMob", null, null, null, entity, null, null, null, null, null); } } @@ -930,7 +964,7 @@ public class Quester { sheepSheared.put(color, (sheepSheared.get(color) + 1)); if (sheepSheared.get(color).equals(currentStage.sheepToShear.get(color))) { - finishObjective("shearSheep", null, null, null, null, null, null, null, color, 0); + finishObjective("shearSheep", null, null, null, null, null, null, null, color, null); } } @@ -941,35 +975,45 @@ public class Quester { Player player = plugin.getServer().getPlayer(name); - if (itemsDelivered.containsKey(i.getType())) { + ItemStack found = null; + + for(ItemStack is : itemsDelivered.keySet()){ + + if(ItemUtil.compareItems(i, is, true) == 0){ + found = is; + break; + } + + } + if (found != null) { - int amount = itemsDelivered.get(i.getType()); - int req = currentStage.itemAmountsToDeliver.get(currentStage.itemsToDeliver.indexOf(i.getType())); + int amount = itemsDelivered.get(found); + int req = currentStage.itemsToDeliver.get(currentStage.itemsToDeliver.indexOf(found)).getAmount(); if (amount < req) { if ((i.getAmount() + amount) > req) { - itemsDelivered.put(i.getType(), req); + itemsDelivered.put(found, req); int index = player.getInventory().first(i); i.setAmount(i.getAmount() - (req - amount)); //Take away the remaining amount needed to be delivered from the item stack player.getInventory().setItem(index, i); player.updateInventory(); - finishObjective("deliverItem", i.getType(), null, null, null, null, null, null, null, 0); + finishObjective("deliverItem", null, found, null, null, null, null, null, null, null); } else if ((i.getAmount() + amount) == req) { - itemsDelivered.put(i.getType(), req); + itemsDelivered.put(found, req); player.getInventory().setItem(player.getInventory().first(i), null); player.updateInventory(); - finishObjective("deliverItem", i.getType(), null, null, null, null, null, null, null, 0); + finishObjective("deliverItem", null, found, null, null, null, null, null, null, null); } else { - itemsDelivered.put(i.getType(), (amount + i.getAmount())); + itemsDelivered.put(found, (amount + i.getAmount())); player.getInventory().setItem(player.getInventory().first(i), null); player.updateInventory(); - String message = Quests.parseString(currentStage.deliverMessages.get(random.nextInt(currentStage.deliverMessages.size())), currentQuest); + String message = Quests.parseString(currentStage.deliverMessages.get(random.nextInt(currentStage.deliverMessages.size())), currentStage.itemDeliveryTargets.get(currentStage.itemsToDeliver.indexOf(found))); player.sendMessage(message); } @@ -980,39 +1024,7 @@ public class Quester { } - public void craftItem(ItemStack i) { - - if (itemsCrafted.containsKey(i.getType())) { - - for (EnumMap m : currentStage.itemsToCraft.keySet()) { - - if (m.containsKey(i.getType())) { - - if (itemsCrafted.get(i.getType()) < (Integer) m.get(i.getType())) { - int integer = itemsCrafted.get(i.getType()); - if ((i.getAmount() + integer) >= (Integer) m.get(i.getType())) { - itemsCrafted.put(i.getType(), (Integer) m.get(i.getType())); - } else { - itemsCrafted.put(i.getType(), (integer + i.getAmount())); - } - - if (itemsCrafted.get(i.getType()).equals((Integer) m.get(i.getType()))) { - finishObjective("craftItem", i.getType(), null, null, null, null, null, null, null, 0); - } - - } - - break; - - } - - } - - } - - } - - public void finishObjective(String objective, Material material, ItemStack itemstack, Enchantment enchantment, EntityType mob, String player, NPC npc, Location location, DyeColor color, int dv) { + public void finishObjective(String objective, Material material, ItemStack itemstack, Enchantment enchantment, EntityType mob, String player, NPC npc, Location location, DyeColor color, String boss) { Player p = plugin.getServer().getPlayerExact(name); @@ -1091,7 +1103,7 @@ public class Quester { } else if (objective.equalsIgnoreCase("deliverItem")) { - String message = ChatColor.GREEN + "(Completed) Deliver " + currentStage.itemAmountsToDeliver.get(currentStage.itemsToDeliver.indexOf(material)) + " " + prettyItemString(material.getId()) + " to " + currentStage.itemDeliveryTargets.get(currentStage.itemsToDeliver.indexOf(material)).getName(); + String message = ChatColor.GREEN + "(Completed) Deliver " + ItemUtil.getString(currentStage.itemsToDeliver.get(currentStage.itemsToDeliver.indexOf(itemstack))) + " " + ItemUtil.getName(itemstack) + " to " + currentStage.itemDeliveryTargets.get(currentStage.itemsToDeliver.indexOf(itemstack)).getName(); p.sendMessage(message); if (testComplete()) { currentQuest.nextStage(this); @@ -1132,6 +1144,16 @@ public class Quester { currentQuest.nextStage(this); } + } else if (objective.equalsIgnoreCase("killBoss")) { + + LoadBoss b = Quests.getBoss(boss); + String message = ChatColor.GREEN + "(Completed) Kill " + ChatColor.ITALIC + b.getName() + ChatColor.RESET + ChatColor.GREEN; + message = message + " " + currentStage.bossAmountsToKill.get(currentStage.bossesToKill.indexOf(boss)) + "/" + currentStage.bossAmountsToKill.get(currentStage.bossesToKill.indexOf(boss)); + p.sendMessage(message); + if (testComplete()) { + currentQuest.nextStage(this); + } + } else if (objective.equalsIgnoreCase("tameMob")) { String message = ChatColor.GREEN + "(Completed) Tame " + getCapitalized(mob.getName()); @@ -1246,9 +1268,9 @@ public class Quester { playersKilled = 0; if (currentStage.itemsToDeliver.isEmpty() == false) { - for (Material m : currentStage.itemsToDeliver) { + for (ItemStack is : currentStage.itemsToDeliver) { - itemsDelivered.put(m, 0); + itemsDelivered.put(is, 0); } } @@ -1270,6 +1292,15 @@ public class Quester { } } + if (currentStage.bossesToKill.isEmpty() == false) { + for (String s : currentStage.bossesToKill) { + + bossesKilled.add(s); + bossAmountsKilled.add(0); + + } + } + if (currentStage.blocksToCut.isEmpty() == false) { for (Material m : currentStage.blocksToCut.keySet()) { @@ -1304,18 +1335,6 @@ public class Quester { } } - if (currentStage.itemsToCraft.isEmpty() == false) { - for (Entry e : currentStage.itemsToCraft.entrySet()) { - - for (Object o : ((Map) e.getKey()).keySet()) { - - itemsCrafted.put((Material) o, 0); - - } - - } - } - } public void reset() { @@ -1341,7 +1360,8 @@ public class Quester { radiiToReachWithin.clear(); mobsTamed.clear(); sheepSheared.clear(); - itemsCrafted.clear(); + bossesKilled.clear(); + bossAmountsKilled.clear(); } @@ -1516,6 +1536,60 @@ public class Quester { } + public static String enchantmentString(Enchantment e) { + + String string = ""; + + if (e.equals(Enchantment.ARROW_DAMAGE)) { + string = "Power"; + } else if (e.equals(Enchantment.ARROW_FIRE)) { + string = "Flame"; + } else if (e.equals(Enchantment.ARROW_INFINITE)) { + string = "Infinity"; + } else if (e.equals(Enchantment.ARROW_KNOCKBACK)) { + string = "Punch"; + } else if (e.equals(Enchantment.DAMAGE_ALL)) { + string = "Sharpness"; + } else if (e.equals(Enchantment.DAMAGE_ARTHROPODS)) { + string = "BaneOfArthropods"; + } else if (e.equals(Enchantment.DAMAGE_UNDEAD)) { + string = "Smite"; + } else if (e.equals(Enchantment.DIG_SPEED)) { + string = "Efficiency"; + } else if (e.equals(Enchantment.DURABILITY)) { + string = "Unbreaking"; + } else if (e.equals(Enchantment.FIRE_ASPECT)) { + string = "FireAspect"; + } else if (e.equals(Enchantment.KNOCKBACK)) { + string = "Knockback"; + } else if (e.equals(Enchantment.LOOT_BONUS_BLOCKS)) { + string = "Fortune"; + } else if (e.equals(Enchantment.LOOT_BONUS_MOBS)) { + string = "Looting"; + } else if (e.equals(Enchantment.OXYGEN)) { + string = "Respiration"; + } else if (e.equals(Enchantment.PROTECTION_ENVIRONMENTAL)) { + string = "Protection"; + } else if (e.equals(Enchantment.PROTECTION_EXPLOSIONS)) { + string = "BlastProtection"; + } else if (e.equals(Enchantment.PROTECTION_FALL)) { + string = "FeatherFalling"; + } else if (e.equals(Enchantment.PROTECTION_FIRE)) { + string = "FireProtection"; + } else if (e.equals(Enchantment.PROTECTION_PROJECTILE)) { + string = "ProjectileProtection"; + } else if (e.equals(Enchantment.SILK_TOUCH)) { + string = "SilkTouch"; + } else if (e.equals(Enchantment.THORNS)) { + string = "Thorns"; + } else if (e.equals(Enchantment.WATER_WORKER)) { + string = "AquaAffinity"; + } + + return string; + + } + public static String prettyColorString(DyeColor color) { if (color.equals(DyeColor.BLACK)) { @@ -1764,17 +1838,14 @@ public class Quester { if (itemsDelivered.isEmpty() == false) { - LinkedList deliveryIds = new LinkedList(); LinkedList deliveryAmounts = new LinkedList(); - for (Entry e : itemsDelivered.entrySet()) { + for (Entry e : itemsDelivered.entrySet()) { - deliveryIds.add(e.getKey().getId()); deliveryAmounts.add(e.getValue()); } - data.set("item-delivery-ids", deliveryIds); data.set("item-delivery-amounts", deliveryAmounts); } @@ -1811,6 +1882,13 @@ public class Quester { } + if (bossesKilled.isEmpty() == false) { + + data.set("bosses-killed", bossesKilled); + data.set("boss-amounts-killed", bossAmountsKilled); + + } + if (locationsReached.isEmpty() == false) { LinkedList locations = new LinkedList(); @@ -1888,23 +1966,6 @@ public class Quester { } - if (itemsCrafted.isEmpty() == false) { - - LinkedList itemIds = new LinkedList(); - LinkedList itemAmounts = new LinkedList(); - - for (Material m : itemsCrafted.keySet()) { - - itemIds.add(m.getId()); - itemAmounts.add(itemsCrafted.get(m)); - - } - - data.set("item-ids-to-craft", itemIds); - data.set("items-crafted", itemAmounts); - - } - if (delayTimeLeft > 0) { data.set("stage-delay", delayTimeLeft); } @@ -2227,107 +2288,9 @@ public class Quester { for (String s : data.getStringList("mobs-killed")) { - if (s.equalsIgnoreCase("Blaze")) { - - mobs.add(EntityType.BLAZE); - - } else if (s.equalsIgnoreCase("CaveSpider")) { - - mobs.add(EntityType.CAVE_SPIDER); - - } else if (s.equalsIgnoreCase("Chicken")) { - - mobs.add(EntityType.CHICKEN); - - } else if (s.equalsIgnoreCase("Cow")) { - - mobs.add(EntityType.COW); - - } else if (s.equalsIgnoreCase("Creeper")) { - - mobs.add(EntityType.CREEPER); - - } else if (s.equalsIgnoreCase("Enderman")) { - - mobs.add(EntityType.ENDERMAN); - - } else if (s.equalsIgnoreCase("EnderDragon")) { - - mobs.add(EntityType.ENDER_DRAGON); - - } else if (s.equalsIgnoreCase("Ghast")) { - - mobs.add(EntityType.GHAST); - - } else if (s.equalsIgnoreCase("Giant")) { - - mobs.add(EntityType.GIANT); - - } else if (s.equalsIgnoreCase("IronGolem")) { - - mobs.add(EntityType.IRON_GOLEM); - - } else if (s.equalsIgnoreCase("MagmaCube")) { - - mobs.add(EntityType.MAGMA_CUBE); - - } else if (s.equalsIgnoreCase("MushroomCow")) { - - mobs.add(EntityType.MUSHROOM_COW); - - } else if (s.equalsIgnoreCase("Ocelot")) { - - mobs.add(EntityType.OCELOT); - - } else if (s.equalsIgnoreCase("Pig")) { - - mobs.add(EntityType.PIG); - - } else if (s.equalsIgnoreCase("PigZombie")) { - - mobs.add(EntityType.PIG_ZOMBIE); - - } else if (s.equalsIgnoreCase("Sheep")) { - - mobs.add(EntityType.SHEEP); - - } else if (s.equalsIgnoreCase("Silverfish")) { - - mobs.add(EntityType.SILVERFISH); - - } else if (s.equalsIgnoreCase("Skeleton")) { - - mobs.add(EntityType.SKELETON); - - } else if (s.equalsIgnoreCase("Slime")) { - - mobs.add(EntityType.SLIME); - - } else if (s.equalsIgnoreCase("Snowman")) { - - mobs.add(EntityType.SNOWMAN); - - } else if (s.equalsIgnoreCase("Spider")) { - - mobs.add(EntityType.SPIDER); - - } else if (s.equalsIgnoreCase("Squid")) { - - mobs.add(EntityType.SQUID); - - } else if (s.equalsIgnoreCase("Villager")) { - - mobs.add(EntityType.VILLAGER); - - } else if (s.equalsIgnoreCase("Wolf")) { - - mobs.add(EntityType.WOLF); - - } else if (s.equalsIgnoreCase("Zombie")) { - - mobs.add(EntityType.ZOMBIE); - - } + EntityType mob = Quests.getMobType(s); + if(mob != null) + mobs.add(mob); mobsKilled.clear(); mobNumKilled.clear(); @@ -2367,14 +2330,13 @@ public class Quester { } - if (data.contains("item-delivery-ids")) { + if (data.contains("item-delivery-amounts")) { - List deliveryIds = data.getIntegerList("item-delivery-ids"); List deliveryAmounts = data.getIntegerList("item-delivery-amounts"); - for (int i : deliveryIds) { + for (int i = 0; i < deliveryAmounts.size(); i++) { - itemsDelivered.put(Material.getMaterial(i), deliveryAmounts.get(deliveryIds.indexOf(i))); + itemsDelivered.put(currentStage.itemsToDeliver.get(i), deliveryAmounts.get(i)); } @@ -2407,6 +2369,20 @@ public class Quester { } + if (data.contains("bosses-killed")) { + + List ids = data.getStringList("bosses-killed"); + List num = data.getIntegerList("boss-amounts-killed"); + + for (String s : ids) { + + bossesKilled.add(s); + bossAmountsKilled.add(num.get(ids.indexOf(s))); + + } + + } + if (data.contains("locations-to-reach")) { LinkedList locations = new LinkedList(); @@ -2563,19 +2539,6 @@ public class Quester { } - if (data.contains("item-ids-to-craft")) { - - List ids = data.getIntegerList("item-ids-to-craft"); - List amounts = data.getIntegerList("items-crafted"); - - for (int i : ids) { - - itemsCrafted.put(Material.getMaterial(i), amounts.get(ids.indexOf(i))); - - } - - } - if (data.contains("stage-delay")) { delayTimeLeft = data.getLong("stage-delay"); @@ -2639,7 +2602,7 @@ public class Quester { currentStage = null; reset(); if (plugin.getServer().getPlayer(name) != null) { - plugin.getServer().getPlayer(name).sendMessage(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "Your active Quest " + ChatColor.DARK_PURPLE + currentQuest.name + ChatColor.RED + " has been modified. You have quit the Quest."); + plugin.getServer().getPlayer(name).sendMessage(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "Your active Quest " + ChatColor.DARK_PURPLE + currentQuest.name + ChatColor.RED + " has been modified. You have been forced to quit the Quest."); } currentQuest = null; @@ -2656,7 +2619,7 @@ public class Quester { currentStage = null; reset(); if (plugin.getServer().getPlayer(name) != null) { - plugin.getServer().getPlayer(name).sendMessage(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "Your active Quest " + ChatColor.DARK_PURPLE + currentQuest.name + ChatColor.RED + " no longer exists. You have quit the Quest."); + plugin.getServer().getPlayer(name).sendMessage(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "Your active Quest " + ChatColor.DARK_PURPLE + currentQuest.name + ChatColor.RED + " no longer exists. You have been forced to quit the Quest."); } currentQuest = null; diff --git a/src/me/blackvein/quests/Quests.java b/src/me/blackvein/quests/Quests.java index 7f0bfa0e5..90f6ae5c5 100644 --- a/src/me/blackvein/quests/Quests.java +++ b/src/me/blackvein/quests/Quests.java @@ -10,6 +10,11 @@ import java.sql.Timestamp; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; +import me.ThaH3lper.com.EpicBoss; +import me.ThaH3lper.com.LoadBosses.LoadBoss; +import me.blackvein.quests.prompts.QuestAcceptPrompt; +import me.blackvein.quests.util.ItemUtil; +import me.blackvein.quests.util.Lang; import net.aufdemrand.denizen.Denizen; import net.aufdemrand.denizen.scripts.ScriptRegistry; import net.citizensnpcs.api.CitizensPlugin; @@ -35,20 +40,20 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -public class Quests extends JavaPlugin implements ConversationAbandonedListener { +public class Quests extends JavaPlugin implements ConversationAbandonedListener, ColorUtil { public static Economy economy = null; public static Permission permission = null; public static mcMMO mcmmo = null; + public static EpicBoss epicBoss = null; public static boolean snoop = true; -<<<<<<< HEAD public static boolean npcEffects = true; + public static boolean broadcastPartyCreation = true; + public static int maxPartySize = 0; public static String effect = "note"; -======= - public static int timeout = 20; ->>>>>>> Starting rewards item data - List questerBlacklist = new LinkedList(); - ConversationFactory conversationFactory; + final List questerBlacklist = new LinkedList(); + public ConversationFactory conversationFactory; + ConversationFactory NPCConversationFactory; QuestFactory questFactory; EventFactory eventFactory; Vault vault = null; @@ -56,12 +61,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener PlayerListener pListener; NpcEffectThread effListener; NpcListener npcListener; + EpicBossListener bossListener; public Denizen denizen = null; QuestTaskTrigger trigger; - Map questers = new HashMap(); - LinkedList quests = new LinkedList(); - public LinkedList events = new LinkedList(); - LinkedList questNPCs = new LinkedList(); + final Map questers = new HashMap(); + final LinkedList parties = new LinkedList(); + final LinkedList quests = new LinkedList(); + public final LinkedList events = new LinkedList(); + final LinkedList questNPCs = new LinkedList(); boolean allowCommands = true; boolean allowCommandsForNpcQuests = false; boolean showQuestReqs = true; @@ -69,6 +76,8 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener boolean debug = false; boolean load = false; int killDelay = 0; + public static int acceptTimeout = 20; + public static int inviteTimeout = 20; int totalQuestPoints = 0; public final static Logger log = Logger.getLogger("Minecraft"); @@ -78,15 +87,22 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener pListener = new PlayerListener(this); effListener = new NpcEffectThread(this); npcListener = new NpcListener(this); + bossListener = new EpicBossListener(this); this.conversationFactory = new ConversationFactory(this) .withModality(false) .withPrefix(new QuestsPrefix()) .withFirstPrompt(new QuestPrompt()) - .withTimeout(timeout) + .withTimeout(acceptTimeout) .thatExcludesNonPlayersWithMessage("Console may not perform this conversation!") .addConversationAbandonedListener(this); + this.NPCConversationFactory = new ConversationFactory(this) + .withModality(false) + .withFirstPrompt(new QuestAcceptPrompt(this)) + .withTimeout(acceptTimeout) + .withLocalEcho(false) + .addConversationAbandonedListener(this); questFactory = new QuestFactory(this); eventFactory = new EventFactory(this); @@ -110,6 +126,11 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener mcmmo = (mcMMO) getServer().getPluginManager().getPlugin("mcMMO"); } + if (getServer().getPluginManager().getPlugin("EpicBossRecoded") != null) { + epicBoss = (EpicBoss) getServer().getPluginManager().getPlugin("EpicBossRecoded"); + getServer().getPluginManager().registerEvents(bossListener, this); + } + if (!setupEconomy()) { printWarning("[Quests] Economy not found."); } @@ -133,6 +154,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } loadConfig(); + Lang.initPhrases(); if (new File(this.getDataFolder(), "quests.yml").exists() == false) { printInfo("[Quests] Quest data not found, writing default to file."); @@ -162,8 +184,9 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } getServer().getPluginManager().registerEvents(pListener, this); - if(npcEffects) + if (npcEffects) { getServer().getScheduler().scheduleSyncRepeatingTask(this, effListener, 20, 20); + } printInfo("[Quests] Enabled."); getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @@ -173,13 +196,12 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener loadEvents(); log.log(Level.INFO, "[Quests] " + quests.size() + " Quest(s) loaded."); log.log(Level.INFO, "[Quests] " + events.size() + " Event(s) loaded."); - questers = getOnlineQuesters(); - if(snoop) + questers.putAll(getOnlineQuesters()); + if (snoop) { snoop(); + } } }, 5L); - - ItemUtil.plugin = Quests.this; } @@ -203,6 +225,20 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener @Override public void conversationAbandoned(ConversationAbandonedEvent abandonedEvent) { + + if (abandonedEvent.gracefulExit() == false) { + + if (abandonedEvent.getContext().getForWhom() != null) { + + try { + abandonedEvent.getContext().getForWhom().sendRawMessage(YELLOW + "Cancelled."); + } catch (Exception e) { + } + + } + + } + } private class QuestPrompt extends StringPrompt { @@ -210,7 +246,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener @Override public String getPromptText(ConversationContext context) { - return ChatColor.YELLOW + "Accept Quest? " + ChatColor.GREEN + "Yes / No"; + return YELLOW + "Accept Quest? " + GREEN + "Yes / No"; } @@ -226,12 +262,12 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else if (s.equalsIgnoreCase("No")) { - player.sendMessage(ChatColor.YELLOW + "Cancelled."); + player.sendMessage(YELLOW + "Cancelled."); return Prompt.END_OF_CONVERSATION; } else { - player.sendMessage(ChatColor.RED + "Invalid choice. Type \'Yes\' or \'No\'"); + player.sendMessage(RED + "Invalid choice. Type \'Yes\' or \'No\'"); return new QuestPrompt(); } @@ -245,7 +281,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener @Override public String getPrefix(ConversationContext context) { - return "" + ChatColor.GRAY; + return "" + GRAY; } } @@ -259,57 +295,93 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener showQuestReqs = config.getBoolean("show-requirements"); allowQuitting = config.getBoolean("allow-quitting"); snoop = config.getBoolean("snoop", true); -<<<<<<< HEAD npcEffects = config.getBoolean("show-npc-effects", true); effect = config.getString("npc-effect", "note"); debug = config.getBoolean("debug-mode"); killDelay = config.getInt("kill-delay"); -======= - debug = config.getBoolean("debug-mode", false); - killDelay = config.getInt("kill-delay", 600); - timeout = config.getInt("prompt-timeout", 20); ->>>>>>> Starting rewards item data - for (String s : config.getStringList("quester-blacklist")) + acceptTimeout = config.getInt("accept-timeout"); + + if(config.contains("broadcast-party-creation")){ + broadcastPartyCreation = config.getBoolean("broadcast-party-creation"); + }else{ + config.set("broadcast-party-creation", true); + } + + if(config.contains("max-party-size")){ + maxPartySize = config.getInt("max-party-size"); + }else{ + config.set("max-party-size", 0); + } + + if(config.contains("party-invite-timeout")){ + inviteTimeout = config.getInt("party-invite-timeout"); + }else{ + config.set("party-invite-timeout", 20); + } + + for (String s : config.getStringList("quester-blacklist")) { questerBlacklist.add(s); + } + + try{ + config.save(new File(this.getDataFolder(), "config.yml")); + }catch(Exception e){ + e.printStackTrace(); + } } public void printHelp(Player player) { - player.sendMessage(ChatColor.GOLD + "- Quests -"); - player.sendMessage(ChatColor.YELLOW + "/quests - Display this help"); + player.sendMessage(GOLD + "- Quests -"); + player.sendMessage(YELLOW + "/quests - Display this help"); if (player.hasPermission("quests.list")) { - player.sendMessage(ChatColor.YELLOW + "/quests list - List available Quests"); + player.sendMessage(YELLOW + "/quests list - List available Quests"); } if (player.hasPermission("quests.take")) { - player.sendMessage(ChatColor.YELLOW + "/quests take - Accept a Quest"); + player.sendMessage(YELLOW + "/quests take - Accept a Quest"); } if (player.hasPermission("quests.quit")) { - player.sendMessage(ChatColor.YELLOW + "/quests quit - Quit your current Quest"); + player.sendMessage(YELLOW + "/quests quit - Quit your current Quest"); } - if (player.hasPermission("quests.editor.create")) { - player.sendMessage(ChatColor.YELLOW + "/quests create - Create a Quest"); + if (player.hasPermission("quests.editor.editor")) { + player.sendMessage(YELLOW + "/quests editor - Create/Edit Quests"); } - if (player.hasPermission("quests.editor.events")) { - player.sendMessage(ChatColor.YELLOW + "/quests events - Create/Edit Events"); + if (player.hasPermission("quests.editor.events.editor")) { + player.sendMessage(YELLOW + "/quests events - Create/Edit Events"); } if (player.hasPermission("quests.stats")) { - player.sendMessage(ChatColor.YELLOW + "/quests stats - View your Questing stats"); + player.sendMessage(YELLOW + "/quests stats - View your Questing stats"); } if (player.hasPermission("quests.top")) { - player.sendMessage(ChatColor.YELLOW + "/quests top - View top Questers"); + player.sendMessage(YELLOW + "/quests top - View top Questers"); } - player.sendMessage(ChatColor.YELLOW + "/quests info - Display plugin information"); + player.sendMessage(GOLD + "/quests party - Quest Party commands"); + player.sendMessage(YELLOW + "/quests info - Display plugin information"); player.sendMessage(" "); - player.sendMessage(ChatColor.YELLOW + "/quest - Display current Quest objectives"); + player.sendMessage(YELLOW + "/quest - Display current Quest objectives"); if (player.hasPermission("quests.questinfo")) { - player.sendMessage(ChatColor.YELLOW + "/quest - Display Quest information"); + player.sendMessage(YELLOW + "/quest - Display Quest information"); } + if (player.hasPermission("quests.admin")) { - player.sendMessage(ChatColor.DARK_RED + "/questadmin " + ChatColor.RED + "- Questadmin help"); + player.sendMessage(DARKRED + "/questadmin " + RED + "- Questadmin help"); } } + + public void printPartyHelp(Player player){ + + player.sendMessage(PURPLE + "- Quest Parties -"); + player.sendMessage(PINK + "/quests party create - Create new party"); + player.sendMessage(PINK + "/quests party leave - Leave your party"); + player.sendMessage(PINK + "/quests party info - Info about your party"); + player.sendMessage(PURPLE + "- (Leader only) -"); + player.sendMessage(PINK + "/quests party invite - Invite a player to your party"); + player.sendMessage(PINK + "/quests party kick - Kick a member from the party"); + player.sendMessage(PINK + "/quests party setleader - Set a party member as the new leader"); + + } @Override public boolean onCommand(CommandSender cs, Command cmd, String label, String[] args) { @@ -325,7 +397,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (getQuester(cs.getName()).currentQuest != null) { if (getQuester(cs.getName()).delayStartTime == 0) { - cs.sendMessage(ChatColor.GOLD + "---(Objectives)---"); + cs.sendMessage(GOLD + "---(Objectives)---"); } for (String s : getQuester(cs.getName()).getObjectives()) { @@ -336,7 +408,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - cs.sendMessage(ChatColor.YELLOW + "You do not currently have an active Quest."); + cs.sendMessage(YELLOW + "You do not currently have an active Quest."); return true; } @@ -381,37 +453,37 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener Player player = (Player) cs; Quester quester = getQuester(player.getName()); - cs.sendMessage(ChatColor.GOLD + "- " + quest.name + " -"); + cs.sendMessage(GOLD + "- " + quest.name + " -"); cs.sendMessage(" "); if (quest.redoDelay > -1) { if (quest.redoDelay == 0) { - cs.sendMessage(ChatColor.DARK_AQUA + "Redoable"); + cs.sendMessage(DARKAQUA + "Redoable"); } else { - cs.sendMessage(ChatColor.DARK_AQUA + "Redoable every " + ChatColor.AQUA + getTime(quest.redoDelay) + ChatColor.DARK_AQUA + "."); + cs.sendMessage(DARKAQUA + "Redoable every " + AQUA + getTime(quest.redoDelay) + DARKAQUA + "."); } } if (quest.npcStart != null) { - cs.sendMessage(ChatColor.YELLOW + "Start: Speak to " + quest.npcStart.getName()); + cs.sendMessage(YELLOW + "Start: Speak to " + quest.npcStart.getName()); } else { - cs.sendMessage(ChatColor.YELLOW + quest.description); + cs.sendMessage(YELLOW + quest.description); } cs.sendMessage(" "); if (showQuestReqs == true) { - cs.sendMessage(ChatColor.GOLD + "Requirements"); + cs.sendMessage(GOLD + "Requirements"); if (quest.permissionReqs.isEmpty() == false) { for (String perm : quest.permissionReqs) { if (permission.has(player, perm)) { - cs.sendMessage(ChatColor.GREEN + "Permission: " + perm); + cs.sendMessage(GREEN + "Permission: " + perm); } else { - cs.sendMessage(ChatColor.RED + "Permission: " + perm); + cs.sendMessage(RED + "Permission: " + perm); } } @@ -421,9 +493,9 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (quest.questPointsReq != 0) { if (quester.questPoints >= quest.questPointsReq) { - cs.sendMessage(ChatColor.GRAY + "- " + ChatColor.GREEN + quest.questPointsReq + " Quest Points"); + cs.sendMessage(GRAY + "- " + GREEN + quest.questPointsReq + " Quest Points"); } else { - cs.sendMessage(ChatColor.GRAY + "- " + ChatColor.RED + quest.questPointsReq + " Quest Points"); + cs.sendMessage(GRAY + "- " + RED + quest.questPointsReq + " Quest Points"); } } @@ -432,28 +504,28 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (economy.getBalance(quester.name) >= quest.moneyReq) { if (quest.moneyReq == 1) { - cs.sendMessage(ChatColor.GRAY + "- " + ChatColor.GREEN + quest.moneyReq + " " + Quests.getCurrency(false)); + cs.sendMessage(GRAY + "- " + GREEN + quest.moneyReq + " " + Quests.getCurrency(false)); } else { - cs.sendMessage(ChatColor.GRAY + "- " + ChatColor.GREEN + quest.moneyReq + " " + Quests.getCurrency(true)); + cs.sendMessage(GRAY + "- " + GREEN + quest.moneyReq + " " + Quests.getCurrency(true)); } } else { if (quest.moneyReq == 1) { - cs.sendMessage(ChatColor.GRAY + "- " + ChatColor.RED + quest.moneyReq + " " + Quests.getCurrency(false)); + cs.sendMessage(GRAY + "- " + RED + quest.moneyReq + " " + Quests.getCurrency(false)); } else { - cs.sendMessage(ChatColor.GRAY + "- " + ChatColor.RED + quest.moneyReq + " " + Quests.getCurrency(true)); + cs.sendMessage(GRAY + "- " + RED + quest.moneyReq + " " + Quests.getCurrency(true)); } } } - if (quest.itemIds.isEmpty() == false) { + if (quest.items.isEmpty() == false) { - for (int i : quest.itemIds) { + for (ItemStack is : quest.items) { - if (hasItem(player, i, quest.itemAmounts.get(quest.itemIds.indexOf(i))) == true) { - cs.sendMessage(ChatColor.GRAY + "- " + ChatColor.GREEN + Quester.prettyItemString(i) + " x " + quest.itemAmounts.get(quest.itemIds.indexOf(i))); + if (hasItem(player, is) == true) { + cs.sendMessage(GRAY + "- " + GREEN + ItemUtil.getString(is)); } else { - cs.sendMessage(ChatColor.GRAY + "- " + ChatColor.RED + Quester.prettyItemString(i) + " x " + quest.itemAmounts.get(quest.itemIds.indexOf(i))); + cs.sendMessage(GRAY + "- " + RED + ItemUtil.getString(is)); } } @@ -465,9 +537,9 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener for (String s : quest.neededQuests) { if (quester.completedQuests.contains(s)) { - cs.sendMessage(ChatColor.GRAY + "- " + ChatColor.GREEN + "Complete " + ChatColor.DARK_PURPLE + s); + cs.sendMessage(GRAY + "- " + GREEN + "Complete " + ITALIC + s); } else { - cs.sendMessage(ChatColor.GRAY + "- " + ChatColor.RED + "Complete " + ChatColor.DARK_PURPLE + s); + cs.sendMessage(GRAY + "- " + RED + "Complete " + ITALIC + s); } } @@ -478,14 +550,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - cs.sendMessage(ChatColor.YELLOW + "Quest not found."); + cs.sendMessage(YELLOW + "Quest not found."); return true; } } else { - cs.sendMessage(ChatColor.RED + "You do not have permission to view a Quest's information."); + cs.sendMessage(RED + "You do not have permission to view a Quest's information."); return true; } @@ -494,14 +566,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - cs.sendMessage(ChatColor.RED + "You do not have access to that command."); + cs.sendMessage(RED + "You do not have access to that command."); return true; } } else { - cs.sendMessage(ChatColor.YELLOW + "This command may only be performed in-game."); + cs.sendMessage(YELLOW + "This command may only be performed in-game."); return true; } @@ -521,7 +593,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - cs.sendMessage(ChatColor.RED + "You do not have access to that command."); + cs.sendMessage(RED + "You do not have access to that command."); return true; } @@ -543,14 +615,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener page = Integer.parseInt(args[1]); if (page < 1) { - cs.sendMessage(ChatColor.YELLOW + "Page selection must be a positive number."); + cs.sendMessage(YELLOW + "Page selection must be a positive number."); return true; } } catch (Exception e) { - cs.sendMessage(ChatColor.YELLOW + "Page selection must be a number."); + cs.sendMessage(YELLOW + "Page selection must be a number."); return true; } @@ -562,7 +634,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - cs.sendMessage(ChatColor.RED + "You do not have permission to view the Quests list."); + cs.sendMessage(RED + "You do not have permission to view the Quests list."); return true; } @@ -575,7 +647,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (args.length == 1) { - cs.sendMessage(ChatColor.YELLOW + "Usage: /quests take "); + cs.sendMessage(YELLOW + "Usage: /quests take "); return true; } else { @@ -634,20 +706,20 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener final Quester quester = getQuester(cs.getName()); if (quester.currentQuest != null) { - cs.sendMessage(ChatColor.YELLOW + "You may only have one active Quest."); + cs.sendMessage(YELLOW + "You may only have one active Quest."); } else if (quester.completedQuests.contains(quest.name) && quest.redoDelay < 0) { - cs.sendMessage(ChatColor.YELLOW + "You have already completed " + ChatColor.DARK_PURPLE + quest.name + ChatColor.YELLOW + "."); + cs.sendMessage(YELLOW + "You have already completed " + PURPLE + quest.name + YELLOW + "."); } else if (quest.npcStart != null && allowCommandsForNpcQuests == false) { - cs.sendMessage(ChatColor.YELLOW + "You must speak to " + ChatColor.DARK_PURPLE + quest.npcStart.getName() + ChatColor.YELLOW + " to start this Quest."); + cs.sendMessage(YELLOW + "You must speak to " + PURPLE + quest.npcStart.getName() + YELLOW + " to start this Quest."); } else if (quest.blockStart != null) { - cs.sendMessage(ChatColor.DARK_PURPLE + quest.name + ChatColor.YELLOW + " may not be started via command."); + cs.sendMessage(PURPLE + quest.name + YELLOW + " may not be started via command."); } else { boolean takeable = true; if (quester.completedQuests.contains(quest.name)) { if (quester.getDifference(quest) > 0) { - cs.sendMessage(ChatColor.YELLOW + "You may not take " + ChatColor.AQUA + quest.name + ChatColor.YELLOW + " again for another " + ChatColor.DARK_PURPLE + getTime(quester.getDifference(quest)) + ChatColor.YELLOW + "."); + cs.sendMessage(YELLOW + "You may not take " + AQUA + quest.name + YELLOW + " again for another " + PURPLE + getTime(quester.getDifference(quest)) + YELLOW + "."); takeable = false; } @@ -657,15 +729,24 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (cs instanceof Conversable) { - quester.questToTake = quest.name; + if (((Player) cs).isConversing() == false) { - String s = - ChatColor.GOLD + "- " + ChatColor.DARK_PURPLE + quester.questToTake + ChatColor.GOLD + " -\n" - + "\n" - + ChatColor.RESET + getQuest(quester.questToTake).description + "\n"; + quester.questToTake = quest.name; + + String s = + GOLD + "- " + PURPLE + quester.questToTake + GOLD + " -\n" + + "\n" + + RESET + getQuest(quester.questToTake).description + "\n"; + + cs.sendMessage(s); + conversationFactory.buildConversation((Conversable) cs).begin(); + + } else { + + cs.sendMessage(YELLOW + "You are already in a conversation!"); + + } - cs.sendMessage(s); - conversationFactory.buildConversation((Conversable) cs).begin(); return true; } else { return false; @@ -676,7 +757,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - cs.sendMessage(ChatColor.YELLOW + "Quest not found."); + cs.sendMessage(YELLOW + "Quest not found."); return true; } @@ -684,14 +765,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - cs.sendMessage(ChatColor.RED + "You do not have permission to take Quests via commands."); + cs.sendMessage(RED + "You do not have permission to take Quests via commands."); return true; } } else { - cs.sendMessage(ChatColor.YELLOW + "Taking Quests via commands has been disabled."); + cs.sendMessage(YELLOW + "Taking Quests via commands has been disabled."); return true; } @@ -707,26 +788,26 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener quester.reset(); quester.currentStage = null; - cs.sendMessage(ChatColor.YELLOW + "You have quit " + ChatColor.DARK_PURPLE + quester.currentQuest.name + ChatColor.YELLOW + "."); + cs.sendMessage(YELLOW + "You have quit " + PURPLE + quester.currentQuest.name + YELLOW + "."); quester.currentQuest = null; return true; } else { - cs.sendMessage(ChatColor.YELLOW + "You do not currently have an active Quest."); + cs.sendMessage(YELLOW + "You do not currently have an active Quest."); return true; } } else { - cs.sendMessage(ChatColor.RED + "You do not have permission to quit Quests."); + cs.sendMessage(RED + "You do not have permission to quit Quests."); return true; } } else { - cs.sendMessage(ChatColor.YELLOW + "Quitting Quests has been disabled."); + cs.sendMessage(YELLOW + "Quitting Quests has been disabled."); return true; } @@ -734,21 +815,21 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else if (args[0].equalsIgnoreCase("stats")) { Quester quester = getQuester(cs.getName()); - cs.sendMessage(ChatColor.GOLD + "- " + cs.getName() + " -"); - cs.sendMessage(ChatColor.YELLOW + "Quest points: " + ChatColor.DARK_PURPLE + quester.questPoints + "/" + totalQuestPoints); + cs.sendMessage(GOLD + "- " + cs.getName() + " -"); + cs.sendMessage(YELLOW + "Quest points: " + PURPLE + quester.questPoints + "/" + totalQuestPoints); if (quester.currentQuest == null) { - cs.sendMessage(ChatColor.YELLOW + "Current Quest: " + ChatColor.DARK_PURPLE + "None"); + cs.sendMessage(YELLOW + "Current Quest: " + PURPLE + "None"); } else { - cs.sendMessage(ChatColor.YELLOW + "Current Quest: " + ChatColor.DARK_PURPLE + quester.currentQuest.name); + cs.sendMessage(YELLOW + "Current Quest: " + PURPLE + quester.currentQuest.name); } String completed; if (quester.completedQuests.isEmpty()) { - completed = ChatColor.DARK_PURPLE + "None"; + completed = PURPLE + "None"; } else { - completed = ChatColor.DARK_PURPLE + ""; + completed = PURPLE + ""; for (String s : quester.completedQuests) { if (quester.completedQuests.indexOf(s) < (quester.completedQuests.size() - 1)) { @@ -761,14 +842,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } - cs.sendMessage(ChatColor.YELLOW + "- Completed Quests -"); + cs.sendMessage(YELLOW + "- Completed Quests -"); cs.sendMessage(completed); } else if (args[0].equalsIgnoreCase("top")) { if (args.length == 1 || args.length > 2) { - cs.sendMessage(ChatColor.YELLOW + "Usage: /quests top "); + cs.sendMessage(YELLOW + "Usage: /quests top "); } else { @@ -780,14 +861,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } catch (Exception e) { - cs.sendMessage(ChatColor.YELLOW + "Input must be a number."); + cs.sendMessage(YELLOW + "Input must be a number."); return true; } if (topNumber < 1) { - cs.sendMessage(ChatColor.YELLOW + "Input must be a positive number."); + cs.sendMessage(YELLOW + "Input must be a positive number."); return true; } @@ -819,13 +900,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener int numPrinted = 0; - cs.sendMessage(ChatColor.GOLD + "- Top " + ChatColor.DARK_PURPLE + topNumber + ChatColor.GOLD + " Questers -"); + cs.sendMessage(GOLD + "- Top " + PURPLE + topNumber + GOLD + " Questers -"); for (Object o : sortedMap.keySet()) { String s = (String) o; int i = (Integer) sortedMap.get(o); numPrinted++; - cs.sendMessage(ChatColor.YELLOW + String.valueOf(numPrinted) + ". " + s + " - " + ChatColor.DARK_PURPLE + i + ChatColor.YELLOW + " Quest points"); + cs.sendMessage(YELLOW + String.valueOf(numPrinted) + ". " + s + " - " + PURPLE + i + YELLOW + " Quest points"); if (numPrinted == topNumber) { break; @@ -839,33 +920,217 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener return true; - } else if (args[0].equalsIgnoreCase("create")) { + } else if (args[0].equalsIgnoreCase("editor")) { - if (cs.hasPermission("quests.editor.create")) { + if (cs.hasPermission("quests.editor.editor")) { questFactory.convoCreator.buildConversation((Conversable) cs).begin(); } else { - cs.sendMessage(ChatColor.RED + "You do not have permission to create Quests."); + cs.sendMessage(RED + "You do not have permission to use the Quests Editor."); } return true; } else if (args[0].equalsIgnoreCase("events")) { - if (cs.hasPermission("quests.editor.events")) { + if (cs.hasPermission("quests.editor.events.editor")) { eventFactory.convoCreator.buildConversation((Conversable) cs).begin(); } else { - cs.sendMessage(ChatColor.RED + "You do not have permission to use the Events editor."); + cs.sendMessage(RED + "You do not have permission to use the Events editor."); + } + return true; + + } else if (args[0].equalsIgnoreCase("party")) { + + if(cs instanceof Player){ + + Player player = (Player) cs; + Quester quester = getQuester(player.getName()); + + if(args.length == 1){ + + printPartyHelp(player); + + }else{ + + if(args[1].equalsIgnoreCase("create")){ + + if(player.hasPermission("quests.party.create")){ + + if(quester.getParty() == null){ + + if(quester.currentQuest == null){ + + Party party = new Party(quester); + if(broadcastPartyCreation) + getServer().broadcastMessage(Party.partyPrefix + PINK + "" + BOLD + player.getName() + RESET + "" + PINK + " created a Quest Party!"); + parties.add(party); + return true; + + }else{ + player.sendMessage(Party.partyPrefix + RED + "You may not create a party while you are on a Quest."); + return true; + } + + }else{ + player.sendMessage(Party.partyPrefix + RED + "You are already in a party!"); + return true; + } + + }else{ + player.sendMessage(Party.partyPrefix + RED + "You do not have permission to create parties."); + return true; + } + + }else if(args[1].equalsIgnoreCase("leave")){ + + if(quester.getParty() != null){ + + Party party = quester.getParty(); + + if(party.isLeader(quester)){ + + player.sendMessage(Party.partyPrefix + YELLOW + "You have left your party."); + + party.sendMessageEx(RED + "The party leader has left the party. The party has been disbanded.", quester); + party.disband(); + parties.remove(party); + + }else{ + + player.sendMessage(Party.partyPrefix + YELLOW + "You have left your party."); + party.sendMessageEx(YELLOW + player.getName() + PINK + " has left the party.", quester); + party.removeMember(quester); + party.checkSize(); + + } + + return true; + + }else{ + player.sendMessage(Party.partyPrefix + RED + "You are not in a party!"); + return true; + } + + }else if(args[1].equalsIgnoreCase("info")){ + + if(quester.getParty() != null){ + + Party party = quester.getParty(); + + Quest current = party.getQuest(); + Quester leader = party.getLeader(); + LinkedList members = party.getMembers(); + + player.sendMessage(PURPLE + "- " + PINK + "Party" + PURPLE + " -"); + player.sendMessage(YELLOW + "" + BOLD + "Current Quest: " + RESET + "" + YELLOW + current != null ? (current.getName()) : "(None)"); + player.sendMessage(PINK + "" + BOLD + "Leader: " + RESET + "" + PINK + leader.name); + if(members.isEmpty()) + player.sendMessage(PURPLE + "" + BOLD + "Members: " + RESET + "" + PURPLE + "(None)"); + else{ + player.sendMessage(PURPLE + "" + BOLD + "Members: " + RESET); + for(Quester q : members) + player.sendMessage(PURPLE + " - " + q.name); + } + + if(maxPartySize > 0) + player.sendMessage(PINK + "Max Party Size: " + maxPartySize); + + return true; + + }else{ + player.sendMessage(Party.partyPrefix + RED + "You are not in a party!"); + return true; + } + + }else if(args[1].equalsIgnoreCase("invite")){ + + if(args.length == 3){ + + if(quester.getParty() != null){ + + Party party = quester.getParty(); + + if(party.isLeader(quester)){ + + Quest current = party.getQuest(); + + if(current == null){ + + if(maxPartySize < 1 || party.getSize() >= maxPartySize){ + + String search = args[2]; + Player found = null; + + for(Player p : getServer().getOnlinePlayers()){ + + if(p.getName().toLowerCase().contains(search.toLowerCase()) || p.getName().equalsIgnoreCase(search)){ + found = p; + break; + } + + } + + if(found != null){ + + if(getQuester(found.getName()).getParty() == null){ + + a + + }else{ + player.sendMessage(Party.partyPrefix + RED + "" + BOLD + found.getName() + RESET + "" + RED + " is already in a party!"); + return true; + } + + }else{ + player.sendMessage(Party.partyPrefix + RED + "Player not found!"); + return true; + } + + }else{ + player.sendMessage(Party.partyPrefix + RED + "Your party is too large!"); + return true; + } + + }else{ + player.sendMessage(Party.partyPrefix + RED + "You may not invite players to your party while on a Quest!"); + return true; + } + + }else{ + player.sendMessage(Party.partyPrefix + RED + "You are not the leader of your party!"); + return true; + } + + return true; + + }else{ + player.sendMessage(Party.partyPrefix + RED + "You are not in a party!"); + return true; + } + + }else{ + player.sendMessage(YELLOW + "Usage: /quests party invite "); + return true; + } + + } + + } + + }else{ + cs.sendMessage(YELLOW + "This command may only be performed in-game."); + return true; } return true; } else if (args[0].equalsIgnoreCase("info")) { - cs.sendMessage(ChatColor.GOLD + "Quests " + this.getDescription().getVersion()); - cs.sendMessage(ChatColor.GOLD + "Made by " + ChatColor.DARK_RED + "Blackvein"); + cs.sendMessage(GOLD + "Quests " + this.getDescription().getVersion()); + cs.sendMessage(GOLD + "Made by " + DARKRED + "Blackvein"); return true; } else { - cs.sendMessage(ChatColor.YELLOW + "Unknown Quests command. Type /quests for help."); + cs.sendMessage(YELLOW + "Unknown Quests command. Type /quests for help."); return true; } @@ -874,7 +1139,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - cs.sendMessage(ChatColor.YELLOW + "This command may only be performed in-game."); + cs.sendMessage(YELLOW + "This command may only be performed in-game."); return true; } @@ -885,9 +1150,11 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (cs instanceof Player || args.length == 1 && args[0].equalsIgnoreCase("reload")) { - Player player = null; + final Player player; if (cs instanceof Player) { player = (Player) cs; + } else { + player = null; } if (args.length == 0) { @@ -895,7 +1162,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (player.hasPermission("quests.admin")) { printAdminHelp(player); } else { - player.sendMessage(ChatColor.RED + "You do not have access to that command."); + player.sendMessage(RED + "You do not have access to that command."); } } else if (args.length == 1) { @@ -904,15 +1171,15 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (player == null || player.hasPermission("quests.admin.reload")) { reloadQuests(); - cs.sendMessage(ChatColor.GOLD + "Quests reloaded."); - cs.sendMessage(ChatColor.DARK_PURPLE + String.valueOf(quests.size()) + ChatColor.GOLD + " Quests loaded."); + cs.sendMessage(GOLD + "Quests reloaded."); + cs.sendMessage(PURPLE + String.valueOf(quests.size()) + GOLD + " Quests loaded."); } else { - cs.sendMessage(ChatColor.RED + "You do not have access to that command."); + cs.sendMessage(RED + "You do not have access to that command."); } } else { - cs.sendMessage(ChatColor.YELLOW + "Unknown Questadmin command. Type /questadmin for help."); + cs.sendMessage(YELLOW + "Unknown Questadmin command. Type /questadmin for help."); } @@ -935,21 +1202,21 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (target == null) { - player.sendMessage(ChatColor.YELLOW + "Player not found."); + player.sendMessage(YELLOW + "Player not found."); } else { Quester quester = getQuester(target.getName()); if (quester.currentQuest == null) { - player.sendMessage(ChatColor.YELLOW + target.getName() + " does not currently have an active Quest."); + player.sendMessage(YELLOW + target.getName() + " does not currently have an active Quest."); } else { quester.reset(); quester.currentStage = null; - player.sendMessage(ChatColor.GREEN + target.getName() + ChatColor.GOLD + " has forcibly quit the Quest " + ChatColor.DARK_PURPLE + quester.currentQuest.name + ChatColor.GOLD + "."); - target.sendMessage(ChatColor.GREEN + player.getName() + ChatColor.GOLD + " has forced you to quit the Quest " + ChatColor.DARK_PURPLE + quester.currentQuest.name + ChatColor.GOLD + "."); + player.sendMessage(GREEN + target.getName() + GOLD + " has forcibly quit the Quest " + PURPLE + quester.currentQuest.name + GOLD + "."); + target.sendMessage(GREEN + player.getName() + GOLD + " has forced you to quit the Quest " + PURPLE + quester.currentQuest.name + GOLD + "."); quester.currentQuest = null; quester.saveData(); @@ -960,7 +1227,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - player.sendMessage(ChatColor.RED + "You do not have access to that command."); + player.sendMessage(RED + "You do not have access to that command."); } @@ -981,19 +1248,19 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (target == null) { - player.sendMessage(ChatColor.YELLOW + "Player not found."); + player.sendMessage(YELLOW + "Player not found."); } else { Quester quester = getQuester(target.getName()); if (quester.currentQuest == null) { - player.sendMessage(ChatColor.YELLOW + target.getName() + " does not currently have an active Quest."); + player.sendMessage(YELLOW + target.getName() + " does not currently have an active Quest."); } else { - player.sendMessage(ChatColor.GREEN + target.getName() + ChatColor.GOLD + " has advanced to the next Stage in the Quest " + ChatColor.DARK_PURPLE + quester.currentQuest.name + ChatColor.GOLD + "."); - target.sendMessage(ChatColor.GREEN + player.getName() + ChatColor.GOLD + " has advanced you to the next Stage in your Quest " + ChatColor.DARK_PURPLE + quester.currentQuest.name + ChatColor.GOLD + "."); + player.sendMessage(GREEN + target.getName() + GOLD + " has advanced to the next Stage in the Quest " + PURPLE + quester.currentQuest.name + GOLD + "."); + target.sendMessage(GREEN + player.getName() + GOLD + " has advanced you to the next Stage in your Quest " + PURPLE + quester.currentQuest.name + GOLD + "."); quester.currentQuest.nextStage(quester); quester.saveData(); @@ -1004,7 +1271,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - player.sendMessage(ChatColor.RED + "You do not have access to that command."); + player.sendMessage(RED + "You do not have access to that command."); } @@ -1025,19 +1292,19 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (target == null) { - player.sendMessage(ChatColor.YELLOW + "Player not found."); + player.sendMessage(YELLOW + "Player not found."); } else { Quester quester = getQuester(target.getName()); if (quester.currentQuest == null) { - player.sendMessage(ChatColor.YELLOW + target.getName() + " does not currently have an active Quest."); + player.sendMessage(YELLOW + target.getName() + " does not currently have an active Quest."); } else { - player.sendMessage(ChatColor.GREEN + target.getName() + ChatColor.GOLD + " has advanced to the next Stage in the Quest " + ChatColor.DARK_PURPLE + quester.currentQuest.name + ChatColor.GOLD + "."); - target.sendMessage(ChatColor.GREEN + player.getName() + ChatColor.GOLD + " has advanced you to the next Stage in your Quest " + ChatColor.DARK_PURPLE + quester.currentQuest.name + ChatColor.GOLD + "."); + player.sendMessage(GREEN + target.getName() + GOLD + " has advanced to the next Stage in the Quest " + PURPLE + quester.currentQuest.name + GOLD + "."); + target.sendMessage(GREEN + player.getName() + GOLD + " has advanced you to the next Stage in your Quest " + PURPLE + quester.currentQuest.name + GOLD + "."); quester.currentQuest.completeQuest(quester); quester.saveData(); @@ -1048,10 +1315,90 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - player.sendMessage(ChatColor.RED + "You do not have access to that command."); + player.sendMessage(RED + "You do not have access to that command."); } + } else if (args[0].equalsIgnoreCase("pointsall")) { + + if (player.hasPermission("quests.admin.points.all")) { + + final int amount; + + try { + + amount = Integer.parseInt(args[1]); + + if (amount < 0) { + player.sendMessage(RED + "Error: Amount cannot be less than zero!"); + return true; + } + + } catch (Exception e) { + player.sendMessage(RED + "Error: Input was not a number!"); + return true; + } + + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + + File questerFolder = new File(Quests.this.getDataFolder(), "data"); + if (questerFolder.exists() && questerFolder.isDirectory()) { + + FileConfiguration data = new YamlConfiguration(); + int failCount = 0; + boolean suppressed = false; + + for (File f : questerFolder.listFiles()) { + + try { + + data.load(f); + data.set("quest-points", amount); + data.save(f); + + } catch (Exception e) { + + if (failCount < 4) { + player.sendMessage(RED + "Error reading " + DARKAQUA + f.getName() + RED + ", skipping.."); + } else if (suppressed == false) { + player.sendMessage(RED + "Error reading " + DARKAQUA + f.getName() + RED + ", suppressing further errors."); + suppressed = true; + } + + } + + } + + player.sendMessage(GREEN + "Done."); + getServer().broadcastMessage(YELLOW + "[Quests] " + GOLD + "All players' Quest Points have been set to " + AQUA + amount + GOLD + "!"); + + } else { + player.sendMessage(RED + "Error: Unable to read Quests data folder!"); + } + + } + }); + + player.sendMessage(YELLOW + "Setting all players' Quest Points..."); + for (Quester q : questers.values()) { + + q.questPoints = amount; + + } + thread.start(); + + } else { + + player.sendMessage(RED + "You do not have access to that command."); + + } + + } else { + + cs.sendMessage(YELLOW + "Unknown Questadmin command. Type /questadmin for help."); + } } else { @@ -1073,7 +1420,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (target == null) { - player.sendMessage(ChatColor.YELLOW + "Player not found."); + player.sendMessage(YELLOW + "Player not found."); } else { @@ -1127,7 +1474,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (questToGive == null) { - player.sendMessage(ChatColor.YELLOW + "Quest not found."); + player.sendMessage(YELLOW + "Quest not found."); } else { @@ -1138,9 +1485,9 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener quester.currentQuest = questToGive; quester.currentStage = questToGive.stages.getFirst(); quester.addEmpties(); - player.sendMessage(ChatColor.GREEN + target.getName() + ChatColor.GOLD + " has forcibly started the Quest " + ChatColor.DARK_PURPLE + questToGive.name + ChatColor.GOLD + "."); - target.sendMessage(ChatColor.GREEN + player.getName() + ChatColor.GOLD + " has forced you to take the Quest " + ChatColor.DARK_PURPLE + questToGive.name + ChatColor.GOLD + "."); - target.sendMessage(ChatColor.GOLD + "---(Objectives)---"); + player.sendMessage(GREEN + target.getName() + GOLD + " has forcibly started the Quest " + PURPLE + questToGive.name + GOLD + "."); + target.sendMessage(GREEN + player.getName() + GOLD + " has forced you to take the Quest " + PURPLE + questToGive.name + GOLD + "."); + target.sendMessage(GOLD + "---(Objectives)---"); for (String s : quester.getObjectives()) { target.sendMessage(s); } @@ -1153,7 +1500,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - player.sendMessage(ChatColor.RED + "You do not have access to that command."); + player.sendMessage(RED + "You do not have access to that command."); } @@ -1174,7 +1521,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (target == null) { - player.sendMessage(ChatColor.YELLOW + "Player not found."); + player.sendMessage(YELLOW + "Player not found."); } else { @@ -1186,15 +1533,15 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } catch (Exception e) { - player.sendMessage(ChatColor.YELLOW + "Amount must be a number."); + player.sendMessage(YELLOW + "Amount must be a number."); return true; } Quester quester = getQuester(target.getName()); quester.questPoints = points; - player.sendMessage(ChatColor.GREEN + target.getName() + ChatColor.GOLD + "\'s Quest Points have been set to " + ChatColor.DARK_PURPLE + points + ChatColor.GOLD + "."); - target.sendMessage(ChatColor.GREEN + player.getName() + ChatColor.GOLD + " has set your Quest Points to " + ChatColor.DARK_PURPLE + points + ChatColor.GOLD + "."); + player.sendMessage(GREEN + target.getName() + GOLD + "\'s Quest Points have been set to " + PURPLE + points + GOLD + "."); + target.sendMessage(GREEN + player.getName() + GOLD + " has set your Quest Points to " + PURPLE + points + GOLD + "."); quester.saveData(); @@ -1202,17 +1549,21 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - player.sendMessage(ChatColor.RED + "You do not have access to that command."); + player.sendMessage(RED + "You do not have access to that command."); } + } else { + + cs.sendMessage(YELLOW + "Unknown Questadmin command. Type /questadmin for help."); + } } } else { - cs.sendMessage(ChatColor.YELLOW + "This command may only be performed in-game."); + cs.sendMessage(YELLOW + "This command may only be performed in-game."); } @@ -1227,26 +1578,29 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener public void printAdminHelp(Player player) { - player.sendMessage(ChatColor.RED + "- " + ChatColor.DARK_RED + "Questadmin" + ChatColor.RED + " -"); + player.sendMessage(RED + "- " + DARKRED + "Questadmin" + RED + " -"); player.sendMessage(""); - player.sendMessage(ChatColor.DARK_RED + "/questadmin" + ChatColor.RED + " - View Questadmin help"); + player.sendMessage(DARKRED + "/questadmin" + RED + " - View Questadmin help"); if (player.hasPermission("quests.admin.give")) { - player.sendMessage(ChatColor.DARK_RED + "/questadmin give " + ChatColor.RED + " - Force a player to take a Quest"); + player.sendMessage(DARKRED + "/questadmin give " + RED + " - Force a player to take a Quest"); } if (player.hasPermission("quests.admin.quit")) { - player.sendMessage(ChatColor.DARK_RED + "/questadmin quit " + ChatColor.RED + " - Force a player to quit their Quest"); + player.sendMessage(DARKRED + "/questadmin quit " + RED + " - Force a player to quit their Quest"); } if (player.hasPermission("quests.admin.points")) { - player.sendMessage(ChatColor.DARK_RED + "/questadmin points " + ChatColor.RED + " - Set a players Quest Points"); + player.sendMessage(DARKRED + "/questadmin points " + RED + " - Set a players Quest Points"); + } + if (player.hasPermission("quests.admin.pointsall")) { + player.sendMessage(DARKRED + "/questadmin pointsall " + RED + " - Set ALL players' Quest Points"); } if (player.hasPermission("quests.admin.finish")) { - player.sendMessage(ChatColor.DARK_RED + "/questadmin finish " + ChatColor.RED + " - Immediately force Quest completion for a player"); + player.sendMessage(DARKRED + "/questadmin finish " + RED + " - Immediately force Quest completion for a player"); } if (player.hasPermission("quests.admin.nextstage")) { - player.sendMessage(ChatColor.DARK_RED + "/questadmin nextstage " + ChatColor.RED + " - Immediately force Stage completion for a player"); + player.sendMessage(DARKRED + "/questadmin nextstage " + RED + " - Immediately force Stage completion for a player"); } if (player.hasPermission("quests.admin.reload")) { - player.sendMessage(ChatColor.DARK_RED + "/questadmin reload" + ChatColor.RED + " - Reload all Quests"); + player.sendMessage(DARKRED + "/questadmin reload" + RED + " - Reload all Quests"); } } @@ -1254,9 +1608,9 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener public void listQuests(Player player, int page) { if (quests.size() < ((page * 8) - 7)) { - player.sendMessage(ChatColor.YELLOW + "Page does not exist."); + player.sendMessage(YELLOW + "Page does not exist."); } else { - player.sendMessage(ChatColor.GOLD + "- Quests -"); + player.sendMessage(GOLD + "- Quests -"); int numOrder = (page - 1) * 8; @@ -1272,7 +1626,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { subQuests = quests.subList((numOrder), quests.size()); } - } else if (quests.size() >= (numOrder + 6)) { + } else if (quests.size() >= (numOrder + 7)) { subQuests = quests.subList((numOrder - 1), (numOrder + 7)); } else { subQuests = quests.subList((numOrder - 1), quests.size()); @@ -1284,11 +1638,18 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener for (Quest quest : subQuests) { - player.sendMessage(ChatColor.YELLOW + Integer.toString(numOrder) + ". " + quest.name); + player.sendMessage(YELLOW + Integer.toString(numOrder) + ". " + quest.name); numOrder++; } + int numPages = quests.size() / 8; + if ((quests.size() % 8) > 0 || numPages == 0) { + numPages++; + } + + player.sendMessage(GOLD + "- Page " + page + " of " + numPages + " -"); + } } @@ -1346,10 +1707,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener Quester quester = new Quester(this); quester.name = p.getName(); if (quester.loadData() == false) { - System.out.println("Saving data."); quester.saveData(); - } else { - System.out.println("Loaded data."); } qs.put(p.getName(), quester); @@ -1384,7 +1742,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.contains("quests." + s + ".name")) { quest.name = parseString(config.getString("quests." + s + ".name"), quest); } else { - printSevere(ChatColor.GOLD + "[Quests] Quest block \'" + ChatColor.DARK_PURPLE + s + ChatColor.GOLD + "\' is missing " + ChatColor.RED + "name:"); + printSevere(GOLD + "[Quests] Quest block \'" + PURPLE + s + GOLD + "\' is missing " + RED + "name:"); continue; } @@ -1396,7 +1754,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener questNPCs.add(citizens.getNPCRegistry().getById(config.getInt("quests." + s + ".npc-giver-id"))); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "npc-giver-id: " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid NPC id!"); + printSevere(GOLD + "[Quests] " + RED + "npc-giver-id: " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not a valid NPC id!"); continue; } @@ -1408,8 +1766,8 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (location != null) { quest.blockStart = location; } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "block-start: " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not in proper location format!"); - printSevere(ChatColor.GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); + printSevere(GOLD + "[Quests] " + RED + "block-start: " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not in proper location format!"); + printSevere(GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); continue; } @@ -1420,7 +1778,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.getInt("quests." + s + ".redo-delay", -999) != -999) { quest.redoDelay = config.getInt("quests." + s + ".redo-delay"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "redo-delay: " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a number!"); + printSevere(GOLD + "[Quests] " + RED + "redo-delay: " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not a number!"); continue; } @@ -1429,45 +1787,63 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.contains("quests." + s + ".finish-message")) { quest.finished = parseString(config.getString("quests." + s + ".finish-message"), quest); } else { - printSevere(ChatColor.GOLD + "[Quests] Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "finish-message:"); + printSevere(GOLD + "[Quests] Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "finish-message:"); continue; } if (config.contains("quests." + s + ".ask-message")) { quest.description = parseString(config.getString("quests." + s + ".ask-message"), quest); } else { - printSevere(ChatColor.GOLD + "[Quests] Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "ask-message:"); + printSevere(GOLD + "[Quests] Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "ask-message:"); continue; } + if (config.contains("quests." + s + ".event")) { + + Event evt = Event.loadEvent(config.getString("quests." + s + ".event"), this); + + if (evt != null) { + quest.initialEvent = evt; + } else { + printSevere(GOLD + "[Quests] " + RED + "Initial Event in Quest " + PURPLE + quest.name + GOLD + " failed to load."); + continue; + } + + } + if (config.contains("quests." + s + ".requirements")) { if (config.contains("quests." + s + ".requirements.fail-requirement-message")) { quest.failRequirements = parseString(config.getString("quests." + s + ".requirements.fail-requirement-message"), quest); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.YELLOW + "Requirements " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "fail-requirement-message:"); + printSevere(GOLD + "[Quests] " + YELLOW + "Requirements " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "fail-requirement-message:"); continue; } - if (config.contains("quests." + s + ".requirements.item-ids")) { + if (config.contains("quests." + s + ".requirements.items")) { - if (Quests.checkList(config.getList("quests." + s + ".requirements.item-ids"), Integer.class)) { - quest.itemIds = config.getIntegerList("quests." + s + ".requirements.item-ids"); - } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "item-ids: " + ChatColor.YELLOW + "Requirement " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); - continue; - } + if (Quests.checkList(config.getList("quests." + s + ".requirements.items"), String.class)) { + List itemReqs = config.getStringList("quests." + s + ".requirements.items"); + boolean failed = false; + for (String item : itemReqs) { - if (config.contains("quests." + s + ".requirements.item-amounts")) { + ItemStack stack = ItemUtil.readItemStack(item); + if (stack != null) { + quest.items.add(stack); + } else { + failed = true; + break; + } - if (Quests.checkList(config.getList("quests." + s + ".requirements.item-amounts"), Integer.class)) { - quest.itemAmounts = config.getIntegerList("quests." + s + ".requirements.item-amounts"); - } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "item-amounts: " + ChatColor.YELLOW + "Requirement " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + } + + if (failed == true) { + printSevere(GOLD + "[Quests] " + RED + "items: " + YELLOW + "Requirement " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not formatted correctly!"); + continue; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.YELLOW + "Requirements " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "item-amounts:"); + printSevere(GOLD + "[Quests] " + RED + "items: " + YELLOW + "Requirement " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not formatted correctly!"); continue; } @@ -1477,12 +1853,12 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (Quests.checkList(config.getList("quests." + s + ".requirements.remove-items"), Boolean.class)) { quest.removeItems = config.getBooleanList("quests." + s + ".requirements.remove-items"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "remove-items: " + ChatColor.YELLOW + "Requirement " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of true/false values!"); + printSevere(GOLD + "[Quests] " + RED + "remove-items: " + YELLOW + "Requirement " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not a list of true/false values!"); continue; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.YELLOW + "Requirements " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "remove-items:"); + printSevere(GOLD + "[Quests] " + YELLOW + "Requirements " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "remove-items:"); continue; } } @@ -1492,7 +1868,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.getInt("quests." + s + ".requirements.money", -999) != -999) { quest.moneyReq = config.getInt("quests." + s + ".requirements.money"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "money: " + ChatColor.YELLOW + "Requirement " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a number!"); + printSevere(GOLD + "[Quests] " + RED + "money: " + YELLOW + "Requirement " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not a number!"); continue; } @@ -1503,7 +1879,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.getInt("quests." + s + ".requirements.quest-points", -999) != -999) { quest.questPointsReq = config.getInt("quests." + s + ".requirements.quest-points"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "quest-points: " + ChatColor.YELLOW + "Requirement " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a number!"); + printSevere(GOLD + "[Quests] " + RED + "quest-points: " + YELLOW + "Requirement " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not a number!"); continue; } @@ -1540,13 +1916,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } if (failed) { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + failedQuest + ChatColor.GOLD + " inside " + ChatColor.RED + "quests: " + ChatColor.YELLOW + "Requirement " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid Quest name!"); - printSevere(ChatColor.RED + "Make sure you are using the Quest " + ChatColor.DARK_RED + "name: " + ChatColor.RED + "value, and not the block name."); + printSevere(GOLD + "[Quests] " + PINK + failedQuest + GOLD + " inside " + RED + "quests: " + YELLOW + "Requirement " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not a valid Quest name!"); + printSevere(RED + "Make sure you are using the Quest " + DARKRED + "name: " + RED + "value, and not the block name."); continue; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "quests: " + ChatColor.YELLOW + "Requirement " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of Quest names!"); + printSevere(GOLD + "[Quests] " + RED + "quests: " + YELLOW + "Requirement " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not a list of Quest names!"); continue; } @@ -1557,7 +1933,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (Quests.checkList(config.getList("quests." + s + ".requirements.permissions"), String.class)) { quest.permissionReqs = config.getStringList("quests." + s + ".requirements.permissions"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "permissions: " + ChatColor.YELLOW + "Requirement " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of permissions!"); + printSevere(GOLD + "[Quests] " + RED + "permissions: " + YELLOW + "Requirement " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is not a list of permissions!"); continue; } @@ -1608,7 +1984,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener trigger = new QuestTaskTrigger(); stage.script = config.getString("quests." + s + ".stages.ordered." + s2 + ".script-to-run"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "script-to-run: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a Denizen script!"); + printSevere(GOLD + "[Quests] " + RED + "script-to-run: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a Denizen script!"); stageFailed = true; break; } @@ -1622,7 +1998,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".break-block-ids"), Integer.class)) { breakids = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".break-block-ids"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "break-block-ids: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "break-block-ids: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } @@ -1632,13 +2008,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".break-block-amounts"), Integer.class)) { breakamounts = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".break-block-amounts"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "break-block-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "break-block-amounts: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "break-block-amounts:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "break-block-amounts:"); stageFailed = true; break; } @@ -1650,7 +2026,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".damage-block-ids"), Integer.class)) { damageids = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".damage-block-ids"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "damage-block-ids: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "damage-block-ids: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } @@ -1660,13 +2036,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".damage-block-amounts"), Integer.class)) { damageamounts = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".damage-block-amounts"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "damage-block-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "damage-block-amounts: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "damage-block-amounts:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "damage-block-amounts:"); stageFailed = true; break; } @@ -1678,7 +2054,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (Material.getMaterial(i) != null) { stage.blocksToDamage.put(Material.getMaterial(i), damageamounts.get(damageids.indexOf(i))); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + i + ChatColor.GOLD + " inside " + ChatColor.GREEN + "damage-block-ids: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid item ID!"); + printSevere(GOLD + "[Quests] " + RED + i + GOLD + " inside " + GREEN + "damage-block-ids: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid item ID!"); stageFailed = true; break; } @@ -1690,7 +2066,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".place-block-ids"), Integer.class)) { placeids = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".place-block-ids"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "place-block-ids: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "place-block-ids: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } @@ -1700,13 +2076,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".place-block-amounts"), Integer.class)) { placeamounts = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".place-block-amounts"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "place-block-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "place-block-amounts: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "place-block-amounts:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "place-block-amounts:"); stageFailed = true; break; } @@ -1718,7 +2094,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (Material.getMaterial(i) != null) { stage.blocksToPlace.put(Material.getMaterial(i), placeamounts.get(placeids.indexOf(i))); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + i + ChatColor.GOLD + " inside " + ChatColor.GREEN + "place-block-ids: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid item ID!"); + printSevere(GOLD + "[Quests] " + RED + i + GOLD + " inside " + GREEN + "place-block-ids: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid item ID!"); stageFailed = true; break; } @@ -1730,7 +2106,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".use-block-ids"), Integer.class)) { useids = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".use-block-ids"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "use-block-ids: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "use-block-ids: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } @@ -1740,13 +2116,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".use-block-amounts"), Integer.class)) { useamounts = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".use-block-amounts"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "use-block-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "use-block-amounts: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "use-block-amounts:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "use-block-amounts:"); stageFailed = true; break; } @@ -1758,7 +2134,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (Material.getMaterial(i) != null) { stage.blocksToUse.put(Material.getMaterial(i), useamounts.get(useids.indexOf(i))); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + i + ChatColor.GOLD + " inside " + ChatColor.GREEN + "use-block-ids: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid item ID!"); + printSevere(GOLD + "[Quests] " + RED + i + GOLD + " inside " + GREEN + "use-block-ids: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid item ID!"); stageFailed = true; break; } @@ -1770,7 +2146,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".cut-block-ids"), Integer.class)) { cutids = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".cut-block-ids"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "cut-block-ids: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "cut-block-ids: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } @@ -1780,13 +2156,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".cut-block-amounts"), Integer.class)) { cutamounts = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".cut-block-amounts"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "cut-block-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "cut-block-amounts: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "cut-block-amounts:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "cut-block-amounts:"); stageFailed = true; break; } @@ -1798,7 +2174,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (Material.getMaterial(i) != null) { stage.blocksToCut.put(Material.getMaterial(i), cutamounts.get(cutids.indexOf(i))); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + i + ChatColor.GOLD + " inside " + ChatColor.GREEN + "cut-block-ids: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid item ID!"); + printSevere(GOLD + "[Quests] " + RED + i + GOLD + " inside " + GREEN + "cut-block-ids: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid item ID!"); stageFailed = true; break; } @@ -1810,7 +2186,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.getInt("quests." + s + ".stages.ordered." + s2 + ".fish-to-catch", -999) != -999) { stage.fishToCatch = config.getInt("quests." + s + ".stages.ordered." + s2 + ".fish-to-catch"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "fish-to-catch:" + ChatColor.GOLD + " inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a number!"); + printSevere(GOLD + "[Quests] " + RED + "fish-to-catch:" + GOLD + " inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a number!"); stageFailed = true; break; } @@ -1822,7 +2198,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.getInt("quests." + s + ".stages.ordered." + s2 + ".players-to-kill", -999) != -999) { stage.playersToKill = config.getInt("quests." + s + ".stages.ordered." + s2 + ".players-to-kill"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "players-to-kill:" + ChatColor.GOLD + " inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a number!"); + printSevere(GOLD + "[Quests] " + RED + "players-to-kill:" + GOLD + " inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a number!"); stageFailed = true; break; } @@ -1843,7 +2219,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + enchant + ChatColor.GOLD + " inside " + ChatColor.GREEN + "enchantments: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid enchantment!"); + printSevere(GOLD + "[Quests] " + RED + enchant + GOLD + " inside " + GREEN + "enchantments: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid enchantment!"); stageFailed = true; break; @@ -1852,7 +2228,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "enchantments: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of enchantment names!"); + printSevere(GOLD + "[Quests] " + RED + "enchantments: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of enchantment names!"); stageFailed = true; break; } @@ -1866,7 +2242,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (Material.getMaterial(item) != null) { itemsToEnchant.add(Material.getMaterial(item)); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + item + ChatColor.GOLD + " inside " + ChatColor.GREEN + "enchantment-item-ids: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid item id!"); + printSevere(GOLD + "[Quests] " + RED + item + GOLD + " inside " + GREEN + "enchantment-item-ids: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid item id!"); stageFailed = true; break; } @@ -1875,14 +2251,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "enchantment-item-ids: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "enchantment-item-ids: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "enchantment-item-ids:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "enchantment-item-ids:"); stageFailed = true; break; } @@ -1896,14 +2272,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "enchantment-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "enchantment-amounts: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "enchantment-amounts:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "enchantment-amounts:"); stageFailed = true; break; } @@ -1928,7 +2304,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener questNPCs.add(citizens.getNPCRegistry().getById(i)); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + i + ChatColor.GOLD + " inside " + ChatColor.GREEN + "npc-ids-to-talk-to: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid NPC id!"); + printSevere(GOLD + "[Quests] " + RED + i + GOLD + " inside " + GREEN + "npc-ids-to-talk-to: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid NPC id!"); stageFailed = true; break; } @@ -1936,116 +2312,88 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "npc-ids-to-talk-to: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "npc-ids-to-talk-to: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } - List itemIdsToDeliver; - List itemAmountsToDeliver; + List itemsToDeliver; List itemDeliveryTargetIds; ArrayList deliveryMessages = new ArrayList(); - if (config.contains("quests." + s + ".stages.ordered." + s2 + ".item-ids-to-deliver")) { + if (config.contains("quests." + s + ".stages.ordered." + s2 + ".items-to-deliver")) { - if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".item-ids-to-deliver"), Integer.class)) { + if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".items-to-deliver"), String.class)) { - if (config.contains("quests." + s + ".stages.ordered." + s2 + ".item-amounts-to-deliver")) { + if (config.contains("quests." + s + ".stages.ordered." + s2 + ".npc-delivery-ids")) { - if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".item-amounts-to-deliver"), Integer.class)) { + if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".npc-delivery-ids"), Integer.class)) { - if (config.contains("quests." + s + ".stages.ordered." + s2 + ".npc-delivery-ids")) { + if (config.contains("quests." + s + ".stages.ordered." + s2 + ".delivery-messages")) { - if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".npc-delivery-ids"), Integer.class)) { + itemsToDeliver = config.getStringList("quests." + s + ".stages.ordered." + s2 + ".items-to-deliver"); + itemDeliveryTargetIds = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".npc-delivery-ids"); + deliveryMessages.addAll(config.getStringList("quests." + s + ".stages.ordered." + s2 + ".delivery-messages")); - if (config.contains("quests." + s + ".stages.ordered." + s2 + ".delivery-messages")) { + for (String item : itemsToDeliver) { - itemIdsToDeliver = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".item-ids-to-deliver"); - itemAmountsToDeliver = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".item-amounts-to-deliver"); - itemDeliveryTargetIds = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".npc-delivery-ids"); - deliveryMessages.addAll(config.getStringList("quests." + s + ".stages.ordered." + s2 + ".delivery-messages")); + ItemStack is = ItemUtil.readItemStack(item); + + if (is != null) { - for (int i : itemIdsToDeliver) { + int npcId = itemDeliveryTargetIds.get(itemsToDeliver.indexOf(item)); + NPC npc = citizens.getNPCRegistry().getById(npcId); - Material m = Material.getMaterial(i); - if (m != null) { + if (npc != null) { - int amt = itemAmountsToDeliver.get(itemIdsToDeliver.indexOf(i)); - - if (amt > 0) { - - int npcId = itemDeliveryTargetIds.get(itemIdsToDeliver.indexOf(i)); - NPC npc = citizens.getNPCRegistry().getById(npcId); - - if (npc != null) { - - stage.itemsToDeliver.add(m); - stage.itemAmountsToDeliver.add(amt); - stage.itemDeliveryTargets.add(npc); - stage.deliverMessages = deliveryMessages; - - } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + npcId + ChatColor.GOLD + " inside " + ChatColor.GREEN + "npc-delivery-ids: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid NPC id!"); - stageFailed = true; - break; - } - - } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + amt + ChatColor.GOLD + " inside " + ChatColor.GREEN + "item-amounts-to-deliver: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a positive amount!"); - stageFailed = true; - break; - } - - } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + i + ChatColor.GOLD + " inside " + ChatColor.GREEN + "item-ids-to-deliver: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid item id!"); - stageFailed = true; - break; - } + stage.itemsToDeliver.add(is); + stage.itemDeliveryTargets.add(npc); + stage.deliverMessages = deliveryMessages; + } else { + printSevere(GOLD + "[Quests] " + RED + npcId + GOLD + " inside " + GREEN + "npc-delivery-ids: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid NPC id!"); + stageFailed = true; + break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "delivery-messages:"); + printSevere(GOLD + "[Quests] " + RED + item + GOLD + " inside " + GREEN + "items-to-deliver: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not formatted properly!"); stageFailed = true; break; } - } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "npc-delivery-ids: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of ids!"); - stageFailed = true; - break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "npc-delivery-ids:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "delivery-messages:"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "item-amounts-to-deliver: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "npc-delivery-ids: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of NPC ids!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "item-amounts-to-deliver:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "npc-delivery-ids:"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "item-ids-to-deliver: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of ids!"); + printSevere(GOLD + "[Quests] " + RED + "items-to-deliver: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not formatted properly!"); stageFailed = true; break; } } - List npcIdsToKill; - List npcKillAmounts; + List npcIds; + List npcAmounts; if (config.contains("quests." + s + ".stages.ordered." + s2 + ".npc-ids-to-kill")) { @@ -2055,24 +2403,24 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".npc-kill-amounts"), Integer.class)) { - npcIdsToKill = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".npc-ids-to-kill"); - npcKillAmounts = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".npc-kill-amounts"); - for (int i : npcIdsToKill) { + npcIds = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".npc-ids-to-kill"); + npcAmounts = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".npc-kill-amounts"); + for (int i : npcIds) { if (citizens.getNPCRegistry().getById(i) != null) { - if (npcKillAmounts.get(npcIdsToKill.indexOf(i)) > 0) { + if (npcAmounts.get(npcIds.indexOf(i)) > 0) { stage.citizensToKill.add(citizens.getNPCRegistry().getById(i)); - stage.citizenNumToKill.add(npcKillAmounts.get(npcIdsToKill.indexOf(i))); + stage.citizenNumToKill.add(npcAmounts.get(npcIds.indexOf(i))); questNPCs.add(citizens.getNPCRegistry().getById(i)); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + npcKillAmounts.get(npcIdsToKill.indexOf(i)) + ChatColor.GOLD + " inside " + ChatColor.GREEN + "npc-kill-amounts: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a positive number!"); + printSevere(GOLD + "[Quests] " + RED + npcAmounts.get(npcIds.indexOf(i)) + GOLD + " inside " + GREEN + "npc-kill-amounts: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a positive number!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + i + ChatColor.GOLD + " inside " + ChatColor.GREEN + "npc-ids-to-kill: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid NPC id!"); + printSevere(GOLD + "[Quests] " + RED + i + GOLD + " inside " + GREEN + "npc-ids-to-kill: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid NPC id!"); stageFailed = true; break; } @@ -2080,19 +2428,73 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "npc-kill-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "npc-kill-amounts: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "npc-kill-amounts:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "npc-kill-amounts:"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "npc-ids-to-kill: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "npc-ids-to-kill: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); + stageFailed = true; + break; + } + + } + + List bossIdsToKill; + List bossKillAmounts; + + if (config.contains("quests." + s + ".stages.ordered." + s2 + ".boss-ids-to-kill")) { + + if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".boss-ids-to-kill"), String.class)) { + + if (config.contains("quests." + s + ".stages.ordered." + s2 + ".boss-amounts-to-kill")) { + + if (checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".boss-amounts-to-kill"), Integer.class)) { + + bossIdsToKill = config.getStringList("quests." + s + ".stages.ordered." + s2 + ".boss-ids-to-kill"); + bossKillAmounts = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".boss-amounts-to-kill"); + for (String boss : bossIdsToKill) { + + if (Quests.getBoss(boss) != null) { + + if (bossKillAmounts.get(bossIdsToKill.indexOf(boss)) > 0) { + stage.bossesToKill.add(boss); + stage.bossAmountsToKill.add(bossKillAmounts.get(bossIdsToKill.indexOf(boss))); + } else { + printSevere(GOLD + "[Quests] " + RED + bossKillAmounts.get(bossIdsToKill.indexOf(boss)) + GOLD + " inside " + GREEN + "boss-amounts-to-kill: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a positive number!"); + stageFailed = true; + break; + } + + } else { + printSevere(GOLD + "[Quests] " + RED + boss + GOLD + " inside " + GREEN + "boss-ids-to-kill: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid EpicBoss name!"); + stageFailed = true; + break; + } + + } + + } else { + printSevere(GOLD + "[Quests] " + RED + "boss-amounts-to-kill: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); + stageFailed = true; + break; + } + + } else { + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "boss-amounts-to-kill:"); + stageFailed = true; + break; + } + + } else { + printSevere(GOLD + "[Quests] " + RED + "boss-ids-to-kill: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of IDs!"); stageFailed = true; break; } @@ -2208,7 +2610,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + mob + ChatColor.GOLD + " inside " + ChatColor.GREEN + "mobs-to-kill: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid mob name!"); + printSevere(GOLD + "[Quests] " + RED + mob + GOLD + " inside " + GREEN + "mobs-to-kill: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid mob name!"); stageFailed = true; break; @@ -2217,7 +2619,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "mobs-to-kill: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of mob names!"); + printSevere(GOLD + "[Quests] " + RED + "mobs-to-kill: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of mob names!"); stageFailed = true; break; } @@ -2234,14 +2636,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "mob-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "mob-amounts: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "mob-amounts:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "mob-amounts:"); stageFailed = true; break; } @@ -2266,8 +2668,8 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener y = Double.parseDouble(info[2]); z = Double.parseDouble(info[3]); } catch (Exception e) { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + loc + ChatColor.GOLD + " inside " + ChatColor.GREEN + "mobs-to-kill: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not in proper location format!"); - printSevere(ChatColor.GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); + printSevere(GOLD + "[Quests] " + RED + loc + GOLD + " inside " + GREEN + "mobs-to-kill: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not in proper location format!"); + printSevere(GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); stageFailed = true; break; } @@ -2276,14 +2678,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener Location finalLocation = new Location(getServer().getWorld(info[0]), x, y, z); locationsToKillWithin.add(finalLocation); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + info[0] + ChatColor.GOLD + " inside " + ChatColor.GREEN + "mobs-to-kill: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid world name!"); + printSevere(GOLD + "[Quests] " + RED + info[0] + GOLD + " inside " + GREEN + "mobs-to-kill: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid world name!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + loc + ChatColor.GOLD + " inside " + ChatColor.GREEN + "mobs-to-kill: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not in proper location format!"); - printSevere(ChatColor.GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); + printSevere(GOLD + "[Quests] " + RED + loc + GOLD + " inside " + GREEN + "mobs-to-kill: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not in proper location format!"); + printSevere(GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); stageFailed = true; break; } @@ -2291,7 +2693,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "locations-to-kill: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of locations!"); + printSevere(GOLD + "[Quests] " + RED + "locations-to-kill: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of locations!"); stageFailed = true; break; } @@ -2308,13 +2710,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "kill-location-radii: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "kill-location-radii: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "kill-location-radii:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "kill-location-radii:"); stageFailed = true; break; } @@ -2331,13 +2733,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "kill-location-names: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of names!"); + printSevere(GOLD + "[Quests] " + RED + "kill-location-names: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of names!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "kill-location-names:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "kill-location-names:"); stageFailed = true; break; } @@ -2395,8 +2797,8 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener y = Double.parseDouble(info[2]); z = Double.parseDouble(info[3]); } catch (Exception e) { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + loc + ChatColor.GOLD + " inside " + ChatColor.GREEN + "locations-to-reach: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not in proper location format!"); - printSevere(ChatColor.GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); + printSevere(GOLD + "[Quests] " + RED + loc + GOLD + " inside " + GREEN + "locations-to-reach: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not in proper location format!"); + printSevere(GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); stageFailed = true; break; } @@ -2405,14 +2807,14 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener Location finalLocation = new Location(getServer().getWorld(info[0]), x, y, z); stage.locationsToReach.add(finalLocation); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + info[0] + ChatColor.GOLD + " inside " + ChatColor.GREEN + "locations-to-reach: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid world name!"); + printSevere(GOLD + "[Quests] " + RED + info[0] + GOLD + " inside " + GREEN + "locations-to-reach: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid world name!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + loc + ChatColor.GOLD + " inside " + ChatColor.GREEN + "mobs-to-kill: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not in proper location format!"); - printSevere(ChatColor.GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); + printSevere(GOLD + "[Quests] " + RED + loc + GOLD + " inside " + GREEN + "mobs-to-kill: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not in proper location format!"); + printSevere(GOLD + "[Quests] Proper location format is: \"WorldName x y z\""); stageFailed = true; break; } @@ -2420,7 +2822,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "locations-to-reach: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of locations!"); + printSevere(GOLD + "[Quests] " + RED + "locations-to-reach: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of locations!"); stageFailed = true; break; } @@ -2437,13 +2839,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "reach-location-radii: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "reach-location-radii: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "reach-location-radii:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "reach-location-radii:"); stageFailed = true; break; } @@ -2460,13 +2862,13 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "reach-location-names: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of names!"); + printSevere(GOLD + "[Quests] " + RED + "reach-location-names: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of names!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "reach-location-names:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "reach-location-names:"); stageFailed = true; break; } @@ -2495,7 +2897,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener stage.mobsToTame.put(EntityType.OCELOT, mobAmounts.get(mobs.indexOf(mob))); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + mob + ChatColor.GOLD + " inside " + ChatColor.GREEN + "mobs-to-tame: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid tameable mob!"); + printSevere(GOLD + "[Quests] " + RED + mob + GOLD + " inside " + GREEN + "mobs-to-tame: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid tameable mob!"); stageFailed = true; break; } @@ -2503,19 +2905,19 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "mob-tame-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "mob-tame-amounts: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "mob-tame-amounts:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "mob-tame-amounts:"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "mobs-to-tame: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of mob names!"); + printSevere(GOLD + "[Quests] " + RED + "mobs-to-tame: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of mob names!"); stageFailed = true; break; } @@ -2601,7 +3003,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + color + ChatColor.GOLD + " inside " + ChatColor.GREEN + "sheep-to-shear: " + ChatColor.GOLD + "inside " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid color!"); + printSevere(GOLD + "[Quests] " + RED + color + GOLD + " inside " + GREEN + "sheep-to-shear: " + GOLD + "inside " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a valid color!"); stageFailed = true; break; @@ -2610,74 +3012,19 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "sheep-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); + printSevere(GOLD + "[Quests] " + RED + "sheep-amounts: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of numbers!"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "sheep-amounts:"); + printSevere(GOLD + "[Quests] " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "sheep-amounts:"); stageFailed = true; break; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "sheep-to-shear: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of colors!"); - stageFailed = true; - break; - } - - } - - if (config.contains("quests." + s + ".stages.ordered." + s2 + ".craft-item-ids")) { - - if (Quests.checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".craft-item-ids"), Integer.class)) { - - if (config.contains("quests." + s + ".stages.ordered." + s2 + ".craft-item-amounts")) { - - if (Quests.checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".craft-item-amounts"), Integer.class)) { - - if (config.contains("quests." + s + ".stages.ordered." + s2 + ".craft-quest-items")) { - - if (Quests.checkList(config.getList("quests." + s + ".stages.ordered." + s2 + ".craft-quest-items"), Boolean.class)) { - - List craftIds = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".craft-item-ids"); - List craftAmounts = config.getIntegerList("quests." + s + ".stages.ordered." + s2 + ".craft-item-amounts"); - List craftQuestItems = config.getBooleanList("quests." + s + ".stages.ordered." + s2 + ".craft-quest-items"); - - for (int i : craftIds) { - - EnumMap map = new EnumMap(Material.class); - if (firstStage) { - quest.questItems.put(Material.getMaterial(i), craftAmounts.get(craftIds.indexOf(i))); - } - map.put(Material.getMaterial(i), craftAmounts.get(craftIds.indexOf(i))); - stage.itemsToCraft.put(map, craftQuestItems.get(craftIds.indexOf(i))); - - } - - } - - } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "craft-quest-items:"); - stageFailed = true; - break; - } - - } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "craft-item-amounts: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of numbers!"); - stageFailed = true; - break; - } - - } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "craft-item-amounts:"); - stageFailed = true; - break; - } - - } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "craft-item-ids: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of item ids!"); + printSevere(GOLD + "[Quests] " + RED + "sheep-to-shear: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a list of colors!"); stageFailed = true; break; } @@ -2686,12 +3033,12 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.contains("quests." + s + ".stages.ordered." + s2 + ".event")) { - Event evt = Event.getEvent(config.getString("quests." + s + ".stages.ordered." + s2 + ".event"), this); + Event evt = Event.loadEvent(config.getString("quests." + s + ".stages.ordered." + s2 + ".event"), this); if (evt != null) { stage.event = evt; } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "Event " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " failed to load."); + printSevere(GOLD + "[Quests] " + RED + "Event " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " failed to load."); stageFailed = true; break; } @@ -2703,7 +3050,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.getLong("quests." + s + ".stages.ordered." + s2 + ".delay", -999) != -999) { stage.delay = config.getLong("quests." + s + ".stages.ordered." + s2 + ".delay"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "delay: " + ChatColor.GOLD + "in " + ChatColor.LIGHT_PURPLE + "Stage " + s2 + ChatColor.GOLD + " of Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a number!"); + printSevere(GOLD + "[Quests] " + RED + "delay: " + GOLD + "in " + PINK + "Stage " + s2 + GOLD + " of Quest " + PURPLE + quest.name + GOLD + " is not a number!"); stageFailed = true; break; } @@ -2735,28 +3082,28 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (Quests.checkList(config.getList("quests." + s + ".rewards.items"), String.class)) { - boolean failed = false; - for (String item : config.getStringList("quests." + s + ".rewards.items")) { - - try{ - - ItemStack stack = ItemUtil.parseItem(item); - quest.itemRewards.add(stack); - - }catch(Exception e){ - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + item + ChatColor.GOLD + " in " + ChatColor.GREEN + "items: " + ChatColor.AQUA + "Reward " + ChatColor.GOLD + "in Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not formatted properly!"); - failed = true; - break; - } + boolean failed = false; + for (String item : config.getStringList("quests." + s + ".rewards.items")) { + try { + ItemStack stack = ItemUtil.readItemStack(item); + if (stack != null) { + quest.itemRewards.add(stack); } + } catch (Exception e) { + printSevere(GOLD + "[Quests] " + RED + item + GOLD + " in " + GREEN + "items: " + AQUA + "Reward " + GOLD + "in Quest " + PURPLE + quest.name + GOLD + " is not properly formatted!"); + failed = true; + break; + } - if (failed) { - continue; - } + } + + if (failed) { + continue; + } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "item-ids: " + ChatColor.AQUA + "Reward " + ChatColor.GOLD + "in Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of item ids!"); + printSevere(GOLD + "[Quests] " + RED + "items: " + AQUA + "Reward " + GOLD + "in Quest " + PURPLE + quest.name + GOLD + " is not a list of strings!"); continue; } @@ -2767,7 +3114,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.getInt("quests." + s + ".rewards.money", -999) != -999) { quest.moneyReward = config.getInt("quests." + s + ".rewards.money"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "money: " + ChatColor.AQUA + "Reward " + ChatColor.GOLD + "in Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a number!"); + printSevere(GOLD + "[Quests] " + RED + "money: " + AQUA + "Reward " + GOLD + "in Quest " + PURPLE + quest.name + GOLD + " is not a number!"); continue; } @@ -2778,7 +3125,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (config.getInt("quests." + s + ".rewards.exp", -999) != -999) { quest.exp = config.getInt("quests." + s + ".rewards.exp"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "exp: " + ChatColor.AQUA + "Reward " + ChatColor.GOLD + "in Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a number!"); + printSevere(GOLD + "[Quests] " + RED + "exp: " + AQUA + "Reward " + GOLD + "in Quest " + PURPLE + quest.name + GOLD + " is not a number!"); continue; } @@ -2789,7 +3136,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (Quests.checkList(config.getList("quests." + s + ".rewards.commands"), String.class)) { quest.commands = config.getStringList("quests." + s + ".rewards.commands"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "commands: " + ChatColor.AQUA + "Reward " + ChatColor.GOLD + "in Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of commands!"); + printSevere(GOLD + "[Quests] " + RED + "commands: " + AQUA + "Reward " + GOLD + "in Quest " + PURPLE + quest.name + GOLD + " is not a list of commands!"); continue; } @@ -2800,7 +3147,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener if (Quests.checkList(config.getList("quests." + s + ".rewards.permissions"), String.class)) { quest.permissions = config.getStringList("quests." + s + ".rewards.permissions"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "permissions: " + ChatColor.AQUA + "Reward " + ChatColor.GOLD + "in Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of permissions!"); + printSevere(GOLD + "[Quests] " + RED + "permissions: " + AQUA + "Reward " + GOLD + "in Quest " + PURPLE + quest.name + GOLD + " is not a list of permissions!"); continue; } @@ -2812,7 +3159,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener quest.questPoints = config.getInt("quests." + s + ".rewards.quest-points"); totalQuestPoints += quest.questPoints; } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "quest-points: " + ChatColor.AQUA + "Reward " + ChatColor.GOLD + "in Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a number!"); + printSevere(GOLD + "[Quests] " + RED + "quest-points: " + AQUA + "Reward " + GOLD + "in Quest " + PURPLE + quest.name + GOLD + " is not a number!"); continue; } @@ -2828,7 +3175,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener for (String skill : config.getStringList("quests." + s + ".rewards.mcmmo-skills")) { if (Quests.getMcMMOSkill(skill) == null) { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + skill + ChatColor.GOLD + " in " + ChatColor.GREEN + "mcmmo-skills: " + ChatColor.AQUA + "Reward " + ChatColor.GOLD + "in Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a valid mcMMO skill name!"); + printSevere(GOLD + "[Quests] " + RED + skill + GOLD + " in " + GREEN + "mcmmo-skills: " + AQUA + "Reward " + GOLD + "in Quest " + PURPLE + quest.name + GOLD + " is not a valid mcMMO skill name!"); failed = true; break; } @@ -2842,12 +3189,12 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener quest.mcmmoAmounts = config.getIntegerList("quests." + s + ".rewards.mcmmo-levels"); } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.AQUA + "Rewards " + ChatColor.GOLD + "for Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is missing " + ChatColor.RED + "mcmmo-levels:"); + printSevere(GOLD + "[Quests] " + AQUA + "Rewards " + GOLD + "for Quest " + PURPLE + quest.name + GOLD + " is missing " + RED + "mcmmo-levels:"); continue; } } else { - printSevere(ChatColor.GOLD + "[Quests] " + ChatColor.RED + "mcmmo-skills: " + ChatColor.AQUA + "Reward " + ChatColor.GOLD + "in Quest " + ChatColor.DARK_PURPLE + quest.name + ChatColor.GOLD + " is not a list of mcMMO skill names!"); + printSevere(GOLD + "[Quests] " + RED + "mcmmo-skills: " + AQUA + "Reward " + GOLD + "in Quest " + PURPLE + quest.name + GOLD + " is not a list of mcMMO skill names!"); continue; } } @@ -2888,7 +3235,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener ConfigurationSection sec = config.getConfigurationSection("events"); for (String s : sec.getKeys(false)) { - Event event = Event.getEvent(s, this); + Event event = Event.loadEvent(s, this); if (event != null) { events.add(event); } else { @@ -2907,34 +3254,72 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener parsed = parsed.replaceAll("", quest.npcStart.getName()); } - parsed = parsed.replaceAll("", ChatColor.BLACK.toString()); - parsed = parsed.replaceAll("", ChatColor.DARK_BLUE.toString()); - parsed = parsed.replaceAll("", ChatColor.DARK_GREEN.toString()); - parsed = parsed.replaceAll("", ChatColor.DARK_AQUA.toString()); - parsed = parsed.replaceAll("", ChatColor.DARK_RED.toString()); - parsed = parsed.replaceAll("", ChatColor.DARK_PURPLE.toString()); - parsed = parsed.replaceAll("", ChatColor.GOLD.toString()); - parsed = parsed.replaceAll("", ChatColor.GRAY.toString()); - parsed = parsed.replaceAll("", ChatColor.GRAY.toString()); - parsed = parsed.replaceAll("", ChatColor.DARK_GRAY.toString()); - parsed = parsed.replaceAll("", ChatColor.DARK_GRAY.toString()); - parsed = parsed.replaceAll("", ChatColor.BLUE.toString()); - parsed = parsed.replaceAll("", ChatColor.GREEN.toString()); - parsed = parsed.replaceAll("", ChatColor.AQUA.toString()); - parsed = parsed.replaceAll("", ChatColor.RED.toString()); - parsed = parsed.replaceAll("", ChatColor.LIGHT_PURPLE.toString()); - parsed = parsed.replaceAll("", ChatColor.YELLOW.toString()); - parsed = parsed.replaceAll("", ChatColor.WHITE.toString()); + parsed = parsed.replaceAll("", BLACK.toString()); + parsed = parsed.replaceAll("", DARKBLUE.toString()); + parsed = parsed.replaceAll("", DARKGREEN.toString()); + parsed = parsed.replaceAll("", DARKAQUA.toString()); + parsed = parsed.replaceAll("", DARKRED.toString()); + parsed = parsed.replaceAll("", PURPLE.toString()); + parsed = parsed.replaceAll("", GOLD.toString()); + parsed = parsed.replaceAll("", GRAY.toString()); + parsed = parsed.replaceAll("", GRAY.toString()); + parsed = parsed.replaceAll("", DARKGRAY.toString()); + parsed = parsed.replaceAll("", DARKGRAY.toString()); + parsed = parsed.replaceAll("", BLUE.toString()); + parsed = parsed.replaceAll("", GREEN.toString()); + parsed = parsed.replaceAll("", AQUA.toString()); + parsed = parsed.replaceAll("", RED.toString()); + parsed = parsed.replaceAll("", PINK.toString()); + parsed = parsed.replaceAll("", YELLOW.toString()); + parsed = parsed.replaceAll("", WHITE.toString()); - parsed = parsed.replaceAll("", ChatColor.MAGIC.toString()); - parsed = parsed.replaceAll("", ChatColor.ITALIC.toString()); - parsed = parsed.replaceAll("", ChatColor.BOLD.toString()); - parsed = parsed.replaceAll("", ChatColor.UNDERLINE.toString()); - parsed = parsed.replaceAll("", ChatColor.STRIKETHROUGH.toString()); - parsed = parsed.replaceAll("", ChatColor.RESET.toString()); + parsed = parsed.replaceAll("", MAGIC.toString()); + parsed = parsed.replaceAll("", ITALIC.toString()); + parsed = parsed.replaceAll("", BOLD.toString()); + parsed = parsed.replaceAll("", UNDERLINE.toString()); + parsed = parsed.replaceAll("", STRIKETHROUGH.toString()); + parsed = parsed.replaceAll("", RESET.toString()); return parsed; } + + public static String parseString(String s, NPC npc){ + + String parsed = s; + + if (parsed.contains("")) { + parsed = parsed.replaceAll("", npc.getName()); + } + + parsed = parsed.replaceAll("", BLACK.toString()); + parsed = parsed.replaceAll("", DARKBLUE.toString()); + parsed = parsed.replaceAll("", DARKGREEN.toString()); + parsed = parsed.replaceAll("", DARKAQUA.toString()); + parsed = parsed.replaceAll("", DARKRED.toString()); + parsed = parsed.replaceAll("", PURPLE.toString()); + parsed = parsed.replaceAll("", GOLD.toString()); + parsed = parsed.replaceAll("", GRAY.toString()); + parsed = parsed.replaceAll("", GRAY.toString()); + parsed = parsed.replaceAll("", DARKGRAY.toString()); + parsed = parsed.replaceAll("", DARKGRAY.toString()); + parsed = parsed.replaceAll("", BLUE.toString()); + parsed = parsed.replaceAll("", GREEN.toString()); + parsed = parsed.replaceAll("", AQUA.toString()); + parsed = parsed.replaceAll("", RED.toString()); + parsed = parsed.replaceAll("", PINK.toString()); + parsed = parsed.replaceAll("", YELLOW.toString()); + parsed = parsed.replaceAll("", WHITE.toString()); + + parsed = parsed.replaceAll("", MAGIC.toString()); + parsed = parsed.replaceAll("", ITALIC.toString()); + parsed = parsed.replaceAll("", BOLD.toString()); + parsed = parsed.replaceAll("", UNDERLINE.toString()); + parsed = parsed.replaceAll("", STRIKETHROUGH.toString()); + parsed = parsed.replaceAll("", RESET.toString()); + + return parsed; + + } private boolean setupEconomy() { try { @@ -2990,36 +3375,35 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener public static void printSevere(String s) { - s = ChatColor.stripColor(s); + //s = ChatColor.stripColor(s); log.severe(s); } public static void printWarning(String s) { - s = ChatColor.stripColor(s); + //s = ChatColor.stripColor(s); log.warning(s); } public static void printInfo(String s) { - s = ChatColor.stripColor(s); + //s = ChatColor.stripColor(s); log.info(s); } - public boolean hasItem(Player player, int i, int i2) { + public boolean hasItem(Player player, ItemStack is) { Inventory inv = player.getInventory(); - Material item = Material.getMaterial(i); int playerAmount = 0; for (ItemStack stack : inv.getContents()) { if (stack != null) { - if (stack.getType().equals(item) && stack.getDurability() == stack.getDurability()) { + if (ItemUtil.compareItems(is, stack, false) == 0) { playerAmount += stack.getAmount(); } @@ -3027,7 +3411,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } - if (playerAmount >= i2) { + if (playerAmount >= is.getAmount()) { return true; } else { return false; @@ -3437,22 +3821,29 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener } - public static boolean removeItem(Inventory inventory, Material type, int amount) { + public static boolean removeItem(Inventory inventory, ItemStack is) { + int type = is.getTypeId(); + int amount = is.getAmount(); HashMap allItems = inventory.all(type); HashMap removeFrom = new HashMap(); int foundAmount = 0; for (Map.Entry item : allItems.entrySet()) { - if (item.getValue().getAmount() >= amount - foundAmount) { - removeFrom.put(item.getKey(), amount - foundAmount); - foundAmount = amount; - } else { - foundAmount += item.getValue().getAmount(); - removeFrom.put(item.getKey(), item.getValue().getAmount()); - } - if (foundAmount >= amount) { - break; + if (ItemUtil.compareItems(is, item.getValue(), false) == 0) { + + + if (item.getValue().getAmount() >= amount - foundAmount) { + removeFrom.put(item.getKey(), amount - foundAmount); + foundAmount = amount; + } else { + foundAmount += item.getValue().getAmount(); + removeFrom.put(item.getKey(), item.getValue().getAmount()); + } + if (foundAmount >= amount) { + break; + } + } } @@ -3672,6 +4063,10 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener return Enchantment.SILK_TOUCH; + } else if (enchant.equalsIgnoreCase("Thorns")) { + + return Enchantment.THORNS; + } else if (enchant.equalsIgnoreCase("AquaAffinity")) { return Enchantment.WATER_WORKER; @@ -3766,6 +4161,10 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener return Enchantment.SILK_TOUCH; + } else if (enchant.equalsIgnoreCase("Thorns")) { + + return Enchantment.THORNS; + } else if (enchant.equalsIgnoreCase("Aqua Affinity")) { return Enchantment.WATER_WORKER; @@ -3905,19 +4304,19 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener String cit = citizens != null ? "true" : "false"; statement.executeUpdate("INSERT INTO entries " + "VALUES ('" + getServer().getIp() + ":" + ((Integer) getServer().getPort()).toString() + "', " + quests.size() + ", '" + cit + "', '" + stamp.toString() + "')"); } catch (Exception e) { - } } - public boolean hasQuest(NPC npc, Quester quester){ + public boolean hasQuest(NPC npc, Quester quester) { - for(Quest quest : quests){ + for (Quest quest : quests) { - if(quest.npcStart != null && quester.completedQuests.contains(quest.name) == false){ + if (quest.npcStart != null && quester.completedQuests.contains(quest.name) == false) { - if(quest.npcStart.getId() == npc.getId()) + if (quest.npcStart.getId() == npc.getId()) { return true; + } } @@ -3925,4 +4324,16 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener return false; } + + public static LoadBoss getBoss(String name) { + + for (LoadBoss b : Quests.epicBoss.BossLoadList) { + if (b.getName().equalsIgnoreCase(name)) { + return b; + } + } + + return null; + + } } diff --git a/src/me/blackvein/quests/Stage.java b/src/me/blackvein/quests/Stage.java index 0046791fb..31a23c327 100644 --- a/src/me/blackvein/quests/Stage.java +++ b/src/me/blackvein/quests/Stage.java @@ -12,6 +12,7 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; public class Stage { @@ -29,8 +30,7 @@ public class Stage { LinkedList radiiToKillWithin = new LinkedList(); LinkedList areaNames = new LinkedList(); - LinkedList itemsToDeliver = new LinkedList(); - LinkedList itemAmountsToDeliver = new LinkedList(); + LinkedList itemsToDeliver = new LinkedList(); LinkedList itemDeliveryTargets = new LinkedList(){ @Override @@ -106,6 +106,10 @@ public class Stage { }; LinkedList citizenNumToKill = new LinkedList(); + + LinkedList bossesToKill = new LinkedList(); + LinkedList bossAmountsToKill = new LinkedList(); + LinkedList locationsToReach = new LinkedList(); LinkedList radiiToReachWithin = new LinkedList(); LinkedList worldsToReachWithin = new LinkedList(); @@ -193,10 +197,6 @@ public class Stage { return false; } - if (other.itemAmountsToDeliver.equals(itemAmountsToDeliver) == false){ - return false; - } - if (other.itemDeliveryTargets.equals(itemDeliveryTargets) == false){ return false; } @@ -216,6 +216,14 @@ public class Stage { if (other.citizenNumToKill.equals(citizenNumToKill) == false) { return false; } + + if(other.bossesToKill.equals(bossesToKill) == false){ + return false; + } + + if(other.bossAmountsToKill.equals(bossAmountsToKill) == false){ + return false; + } if (other.locationsToReach.equals(locationsToReach) == false) { return false; diff --git a/src/me/blackvein/quests/languages b/src/me/blackvein/quests/languages new file mode 100644 index 000000000..05712d8a5 --- /dev/null +++ b/src/me/blackvein/quests/languages @@ -0,0 +1,12 @@ +Languages + +en - English +fr - French +es - Spanish +de - German +sv - Swedish +nl - Dutch +pl - Polish +da - Danish +zh - Chinese [Simplified] +no - Norwegian \ No newline at end of file diff --git a/src/me/blackvein/quests/notes b/src/me/blackvein/quests/notes new file mode 100644 index 000000000..218714a50 --- /dev/null +++ b/src/me/blackvein/quests/notes @@ -0,0 +1,5 @@ +Parties + +-1 : No parties +0 : Parties allowed +1+ : Only parties of x size or greater \ No newline at end of file diff --git a/src/me/blackvein/quests/objective names b/src/me/blackvein/quests/objective names new file mode 100644 index 000000000..213191133 --- /dev/null +++ b/src/me/blackvein/quests/objective names @@ -0,0 +1,16 @@ +damageBlock +breakBlock +placeBlock +useBlock +cutBlock +catchFish +enchantItem +killMob +deliverItem +killPlayer +talkToNPC +killNPC +tameMob +shearSheep +craftItem +reachLocation \ No newline at end of file diff --git a/src/me/blackvein/quests/prompts/CreateStagePrompt.java b/src/me/blackvein/quests/prompts/CreateStagePrompt.java index 8fa38929b..cf49019e7 100644 --- a/src/me/blackvein/quests/prompts/CreateStagePrompt.java +++ b/src/me/blackvein/quests/prompts/CreateStagePrompt.java @@ -3,13 +3,16 @@ package me.blackvein.quests.prompts; import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import me.ThaH3lper.com.LoadBosses.LoadBoss; +import me.blackvein.quests.ColorUtil; import me.blackvein.quests.Event; import me.blackvein.quests.QuestFactory; import me.blackvein.quests.Quester; import me.blackvein.quests.Quests; +import me.blackvein.quests.util.ItemUtil; +import me.blackvein.quests.util.Lang; import net.aufdemrand.denizen.scripts.ScriptRegistry; import net.citizensnpcs.api.CitizensPlugin; -import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -20,33 +23,18 @@ import org.bukkit.conversations.Prompt; import org.bukkit.conversations.StringPrompt; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; -public class CreateStagePrompt extends FixedSetPrompt { +public class CreateStagePrompt extends FixedSetPrompt implements ColorUtil { private final int stageNum; private final String pref; private final CitizensPlugin citizens; private final QuestFactory questFactory; - static final ChatColor BOLD = ChatColor.BOLD; - static final ChatColor ITALIC = ChatColor.ITALIC; - static final ChatColor AQUA = ChatColor.AQUA; - static final ChatColor DARKAQUA = ChatColor.DARK_AQUA; - static final ChatColor BLUE = ChatColor.BLUE; - static final ChatColor GOLD = ChatColor.GOLD; - static final ChatColor PINK = ChatColor.LIGHT_PURPLE; - static final ChatColor PURPLE = ChatColor.DARK_PURPLE; - static final ChatColor GREEN = ChatColor.GREEN; - static final ChatColor DARKGREEN = ChatColor.DARK_GREEN; - static final ChatColor RED = ChatColor.RED; - static final ChatColor DARKRED = ChatColor.DARK_RED; - static final ChatColor YELLOW = ChatColor.YELLOW; - static final ChatColor GRAY = ChatColor.GRAY; - static final ChatColor DARKGRAY = ChatColor.DARK_GRAY; - static final ChatColor RESET = ChatColor.RESET; public CreateStagePrompt(int stageNum, QuestFactory qf, CitizensPlugin cit) { - super("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"); + super("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22"); this.stageNum = stageNum; this.pref = "stage" + stageNum; this.citizens = cit; @@ -57,12 +45,12 @@ public class CreateStagePrompt extends FixedSetPrompt { @Override public String getPromptText(ConversationContext context) { - context.setSessionData("stage" + stageNum, Boolean.TRUE); + context.setSessionData(pref, Boolean.TRUE); String text = PINK + "- " + AQUA + (String) context.getSessionData("questName") + PINK + " | Stage " + PURPLE + stageNum + PINK + " -\n"; if (context.getSessionData(pref + "breakIds") == null) { - text += PINK + "" + BOLD + "1 " + RESET + PURPLE + "- Break Blocks " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "1 " + RESET + PURPLE + "- Break Blocks " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { text += PINK + "" + BOLD + "1 " + RESET + PURPLE + "- Break Blocks\n"; @@ -77,7 +65,7 @@ public class CreateStagePrompt extends FixedSetPrompt { if (context.getSessionData(pref + "damageIds") == null) { - text += PINK + "" + BOLD + "2 " + RESET + PURPLE + "- Damage Blocks " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "2 " + RESET + PURPLE + "- Damage Blocks " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { text += PINK + "" + BOLD + "2 " + RESET + PURPLE + "- Damage Blocks\n"; @@ -92,7 +80,7 @@ public class CreateStagePrompt extends FixedSetPrompt { if (context.getSessionData(pref + "placeIds") == null) { - text += PINK + "" + BOLD + "3 " + RESET + PURPLE + "- Place Blocks " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "3 " + RESET + PURPLE + "- Place Blocks " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { text += PINK + "" + BOLD + "3 " + RESET + PURPLE + "- Place Blocks\n"; @@ -107,7 +95,7 @@ public class CreateStagePrompt extends FixedSetPrompt { if (context.getSessionData(pref + "useIds") == null) { - text += PINK + "" + BOLD + "4 " + RESET + PURPLE + "- Use Blocks " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "4 " + RESET + PURPLE + "- Use Blocks " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { text += PINK + "" + BOLD + "4 " + RESET + PURPLE + "- Use Blocks\n"; @@ -122,7 +110,7 @@ public class CreateStagePrompt extends FixedSetPrompt { if (context.getSessionData(pref + "cutIds") == null) { - text += PINK + "" + BOLD + "5 " + RESET + PURPLE + "- Cut Blocks " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "5 " + RESET + PURPLE + "- Cut Blocks " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { text += PINK + "" + BOLD + "5 " + RESET + PURPLE + "- Cut Blocks\n"; @@ -136,21 +124,21 @@ public class CreateStagePrompt extends FixedSetPrompt { } if (context.getSessionData(pref + "fish") == null) { - text += PINK + "" + BOLD + "6 " + RESET + PURPLE + "- Catch Fish " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "6 " + RESET + PURPLE + "- Catch Fish " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { Integer fish = (Integer) context.getSessionData(pref + "fish"); text += PINK + "" + BOLD + "6 " + RESET + PURPLE + "- Catch Fish " + GRAY + "(" + AQUA + fish + " fish" + GRAY + ")\n"; } if (context.getSessionData(pref + "playerKill") == null) { - text += PINK + "" + BOLD + "7 " + RESET + PURPLE + "- Kill Players " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "7 " + RESET + PURPLE + "- Kill Players " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { Integer fish = (Integer) context.getSessionData(pref + "playerKill"); text += PINK + "" + BOLD + "7 " + RESET + PURPLE + "- Kill Players " + GRAY + "(" + AQUA + fish + " players" + GRAY + ")\n"; } if (context.getSessionData(pref + "enchantTypes") == null) { - text += PINK + "" + BOLD + "8 " + RESET + PURPLE + "- Enchant Items " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "8 " + RESET + PURPLE + "- Enchant Items " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { text += PINK + "" + BOLD + "8 " + RESET + PURPLE + "- Enchant Items\n"; @@ -164,31 +152,30 @@ public class CreateStagePrompt extends FixedSetPrompt { } - if(questFactory.quests.citizens != null){ + if (questFactory.quests.citizens != null) { - if (context.getSessionData(pref + "deliveryIds") == null) { - text += PINK + "" + BOLD + "9 " + RESET + PURPLE + "- Deliver Items " + GRAY + "(None set)\n"; + if (context.getSessionData(pref + "deliveryItems") == null) { + text += PINK + "" + BOLD + "9 " + RESET + PURPLE + "- Deliver Items " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { text += PINK + "" + BOLD + "9 " + RESET + PURPLE + "- Deliver Items\n"; LinkedList npcs = (LinkedList) context.getSessionData(pref + "deliveryNPCs"); - LinkedList items = (LinkedList) context.getSessionData(pref + "deliveryIds"); - LinkedList amnts = (LinkedList) context.getSessionData(pref + "deliveryAmounts"); + LinkedList items = (LinkedList) context.getSessionData(pref + "deliveryItems"); for (int i = 0; i < npcs.size(); i++) { - text += GRAY + " - " + BLUE + Quester.prettyItemString(items.get(i)) + GRAY + " x " + AQUA + amnts.get(i) + GRAY + " to " + DARKAQUA + citizens.getNPCRegistry().getById(npcs.get(i)).getName() + "\n"; + text += GRAY + " - " + BLUE + ItemUtil.getName(items.get(i)) + GRAY + " x " + AQUA + items.get(i).getAmount() + GRAY + " to " + DARKAQUA + citizens.getNPCRegistry().getById(npcs.get(i)).getName() + "\n"; } } - }else{ + } else { text += GRAY + "" + BOLD + "9 " + RESET + GRAY + "- Deliver Items " + GRAY + "(Citizens not installed)\n"; } - if(questFactory.quests.citizens != null){ + if (questFactory.quests.citizens != null) { if (context.getSessionData(pref + "npcIdsToTalkTo") == null) { - text += PINK + "" + BOLD + "10 " + RESET + PURPLE + "- Talk to NPCs " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "10 " + RESET + PURPLE + "- Talk to NPCs " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { text += PINK + "" + BOLD + "10 " + RESET + PURPLE + "- Talk to NPCs\n"; @@ -200,14 +187,54 @@ public class CreateStagePrompt extends FixedSetPrompt { } - }else{ + } else { text += GRAY + "" + BOLD + "10 " + RESET + GRAY + "- Talk to NPCs " + GRAY + "(Citizens not installed)\n"; } - if (context.getSessionData(pref + "mobTypes") == null) { - text += PINK + "" + BOLD + "11 " + RESET + PURPLE + "- Kill Mobs " + GRAY + "(None set)\n"; + if (questFactory.quests.citizens != null) { + + if (context.getSessionData(pref + "npcIdsToKill") == null) { + text += PINK + "" + BOLD + "11 " + RESET + PURPLE + "- Kill NPCs " + GRAY + " (" + Lang.get("noneSet") + ")\n"; + } else { + text += PINK + "" + BOLD + "11 " + RESET + PURPLE + "- Kill NPCs\n"; + + LinkedList npcs = (LinkedList) context.getSessionData(pref + "npcIdsToKill"); + LinkedList amounts = (LinkedList) context.getSessionData(pref + "npcAmountsToKill"); + + for (int i = 0; i < npcs.size(); i++) { + text += GRAY + " - " + BLUE + citizens.getNPCRegistry().getById(npcs.get(i)).getName() + GRAY + " x " + AQUA + amounts.get(i) + "\n"; + } + + } + } else { - text += PINK + "" + BOLD + "11 " + RESET + PURPLE + "- Kill Mobs\n"; + text += GRAY + "" + BOLD + "11 " + RESET + GRAY + "- Kill NPCs " + GRAY + "(Citizens not installed)\n"; + } + + if(Quests.epicBoss != null){ + + if (context.getSessionData(pref + "bossIds") == null) { + text += PINK + "" + BOLD + "12 " + RESET + PURPLE + "- Kill Bosses " + GRAY + " (" + Lang.get("noneSet") + ")\n"; + } else { + text += PINK + "" + BOLD + "12 " + RESET + PURPLE + "- Kill Bosses\n"; + + LinkedList bosses = (LinkedList) context.getSessionData(pref + "bossIds"); + LinkedList amnts = (LinkedList) context.getSessionData(pref + "bossAmounts"); + + for (int i = 0; i < bosses.size(); i++) { + text += GRAY + " - " + ITALIC + AQUA + bosses.get(i) + RESET + GRAY + " x " + DARKAQUA + amnts.get(i) + "\n"; + } + + } + + }else{ + text += GRAY + "" + BOLD + "12 " + RESET + GRAY + "- Kill Bosses " + GRAY + "(EpicBoss not installed)\n"; + } + + if (context.getSessionData(pref + "mobTypes") == null) { + text += PINK + "" + BOLD + "13 " + RESET + PURPLE + "- Kill Mobs " + GRAY + " (" + Lang.get("noneSet") + ")\n"; + } else { + text += PINK + "" + BOLD + "13 " + RESET + PURPLE + "- Kill Mobs\n"; LinkedList mobs = (LinkedList) context.getSessionData(pref + "mobTypes"); LinkedList amnts = (LinkedList) context.getSessionData(pref + "mobAmounts"); @@ -233,9 +260,9 @@ public class CreateStagePrompt extends FixedSetPrompt { } if (context.getSessionData(pref + "reachLocations") == null) { - text += PINK + "" + BOLD + "12 " + RESET + PURPLE + "- Reach Locations " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "14 " + RESET + PURPLE + "- Reach Locations " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += PINK + "" + BOLD + "12 " + RESET + PURPLE + "- Reach Locations\n"; + text += PINK + "" + BOLD + "14 " + RESET + PURPLE + "- Reach Locations\n"; LinkedList locations = (LinkedList) context.getSessionData(pref + "reachLocations"); LinkedList radii = (LinkedList) context.getSessionData(pref + "reachLocationRadii"); @@ -250,9 +277,10 @@ public class CreateStagePrompt extends FixedSetPrompt { } if (context.getSessionData(pref + "tameTypes") == null) { - text += PINK + "" + BOLD + "13 " + RESET + PURPLE + "- Tame Mobs " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "15 " + RESET + PURPLE + "- Tame Mobs " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += PINK + "" + BOLD + "13 " + RESET + PURPLE + "- Tame Mobs\n"; + + text += PINK + "" + BOLD + "15 " + RESET + PURPLE + "- Tame Mobs\n"; LinkedList mobs = (LinkedList) context.getSessionData(pref + "tameTypes"); LinkedList amounts = (LinkedList) context.getSessionData(pref + "tameAmounts"); @@ -261,14 +289,12 @@ public class CreateStagePrompt extends FixedSetPrompt { text += GRAY + " - " + BLUE + mobs.get(i) + GRAY + " x " + AQUA + amounts.get(i) + "\n"; } - - } if (context.getSessionData(pref + "shearColors") == null) { - text += PINK + "" + BOLD + "14 " + RESET + PURPLE + "- Shear Sheep " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "16 " + RESET + PURPLE + "- Shear Sheep " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += PINK + "" + BOLD + "14 " + RESET + PURPLE + "- Shear Sheep\n"; + text += PINK + "" + BOLD + "16 " + RESET + PURPLE + "- Shear Sheep\n"; LinkedList colors = (LinkedList) context.getSessionData(pref + "shearColors"); LinkedList amounts = (LinkedList) context.getSessionData(pref + "shearAmounts"); @@ -280,41 +306,41 @@ public class CreateStagePrompt extends FixedSetPrompt { } if (context.getSessionData(pref + "event") == null) { - text += PINK + "" + BOLD + "15 " + RESET + PURPLE + "- Event " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "17 " + RESET + PURPLE + "- Event " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { - text += PINK + "" + BOLD + "15 " + RESET + PURPLE + "- Event " + GRAY + "(" + AQUA + context.getSessionData(pref + "event") + GRAY + ")\n"; + text += PINK + "" + BOLD + "17 " + RESET + PURPLE + "- Event " + GRAY + "(" + AQUA + context.getSessionData(pref + "event") + GRAY + ")\n"; } if (context.getSessionData(pref + "delay") == null) { - text += PINK + "" + BOLD + "16 " + RESET + PURPLE + "- Delay " + GRAY + "(None set)\n"; + text += PINK + "" + BOLD + "18 " + RESET + PURPLE + "- Delay " + GRAY + " (" + Lang.get("noneSet") + ")\n"; } else { long time = (Long) context.getSessionData(pref + "delay"); - text += PINK + "" + BOLD + "16 " + RESET + PURPLE + "- Delay " + GRAY + "(" + AQUA + Quests.getTime(time) + GRAY + ")\n"; + text += PINK + "" + BOLD + "18 " + RESET + PURPLE + "- Delay " + GRAY + "(" + AQUA + Quests.getTime(time) + GRAY + ")\n"; } - if(context.getSessionData(pref + "delay") == null){ - text += GRAY + "" + BOLD + "17 " + RESET + GRAY + "- Delay Message " + GRAY + "(No delay set)\n"; - }else if(context.getSessionData(pref + "delayMessage") == null){ - text += PINK + "" + BOLD + "17 " + RESET + PURPLE + "- Delay Message " + GRAY + "(None set)\n"; - }else{ - text += PINK + "" + BOLD + "17 " + RESET + PURPLE + "- Delay Message " + GRAY + "(" + AQUA + "\"" + context.getSessionData(pref + "delayMessage") + "\"" + GRAY + ")\n"; + if (context.getSessionData(pref + "delay") == null) { + text += GRAY + "" + BOLD + "19 " + RESET + GRAY + "- Delay Message " + GRAY + "(No delay set)\n"; + } else if (context.getSessionData(pref + "delayMessage") == null) { + text += PINK + "" + BOLD + "19 " + RESET + PURPLE + "- Delay Message " + GRAY + " (" + Lang.get("noneSet") + ")\n"; + } else { + text += PINK + "" + BOLD + "19 " + RESET + PURPLE + "- Delay Message " + GRAY + "(" + AQUA + "\"" + context.getSessionData(pref + "delayMessage") + "\"" + GRAY + ")\n"; } - if(questFactory.quests.denizen == null){ - text += GRAY + "" + BOLD + "18 " + RESET + GRAY + "- Denizen Script " + GRAY + "(Denizen not installed)\n"; - }else{ + if (questFactory.quests.denizen == null) { + text += GRAY + "" + BOLD + "19 " + RESET + GRAY + "- Denizen Script " + GRAY + "(Denizen not installed)\n"; + } else { - if(context.getSessionData(pref + "denizen") == null){ - text += GRAY + "" + BOLD + "18 " + RESET + PURPLE + "- Denizen Script " + GRAY + "(None set)\n"; - }else{ - text += PINK + "" + BOLD + "18 " + RESET + PURPLE + "- Denizen Script " + GRAY + "(" + AQUA + context.getSessionData(pref + "denizen") + GRAY + "\n"; + if (context.getSessionData(pref + "denizen") == null) { + text += GRAY + "" + BOLD + "20 " + RESET + PURPLE + "- Denizen Script " + GRAY + " (" + Lang.get("noneSet") + ")\n"; + } else { + text += PINK + "" + BOLD + "20 " + RESET + PURPLE + "- Denizen Script " + GRAY + "(" + AQUA + context.getSessionData(pref + "denizen") + GRAY + "\n"; } } - text += RED + "" + BOLD + "19 " + RESET + PURPLE + "- Delete Stage\n"; - text += GREEN + "" + BOLD + "20 " + RESET + PURPLE + "- Done\n"; + text += RED + "" + BOLD + "21 " + RESET + PURPLE + "- Delete Stage\n"; + text += GREEN + "" + BOLD + "22 " + RESET + PURPLE + "- Done\n"; return text; @@ -340,46 +366,62 @@ public class CreateStagePrompt extends FixedSetPrompt { } else if (input.equalsIgnoreCase("8")) { return new EnchantmentListPrompt(); } else if (input.equalsIgnoreCase("9")) { - if(questFactory.quests.citizens != null) + if (questFactory.quests.citizens != null) { return new DeliveryListPrompt(); - else{ + } else { context.getForWhom().sendRawMessage(RED + "Citizens is not installed!"); return new CreateStagePrompt(stageNum, questFactory, citizens); } } else if (input.equalsIgnoreCase("10")) { - if(questFactory.quests.citizens != null) + if (questFactory.quests.citizens != null) { return new NPCIDsToTalkToPrompt(); - else{ + } else { context.getForWhom().sendRawMessage(RED + "Citizens is not installed!"); return new CreateStagePrompt(stageNum, questFactory, citizens); } } else if (input.equalsIgnoreCase("11")) { - return new MobListPrompt(); + if (questFactory.quests.citizens != null) { + return new NPCKillListPrompt(); + } else { + context.getForWhom().sendRawMessage(RED + "Citizens is not installed!"); + return new CreateStagePrompt(stageNum, questFactory, citizens); + } } else if (input.equalsIgnoreCase("12")) { - return new ReachListPrompt(); + if (Quests.epicBoss != null) { + return new EpicBossListPrompt(); + } else { + context.getForWhom().sendRawMessage(RED + "EpicBoss is not installed!"); + return new CreateStagePrompt(stageNum, questFactory, citizens); + } } else if (input.equalsIgnoreCase("13")) { - return new TameListPrompt(); + return new MobListPrompt(); } else if (input.equalsIgnoreCase("14")) { - return new ShearListPrompt(); + return new ReachListPrompt(); } else if (input.equalsIgnoreCase("15")) { - return new EventPrompt(); + return new TameListPrompt(); } else if (input.equalsIgnoreCase("16")) { - return new DelayPrompt(); + return new ShearListPrompt(); } else if (input.equalsIgnoreCase("17")) { - if(context.getSessionData(pref + "delay") == null){ + return new EventPrompt(); + } else if (input.equalsIgnoreCase("18")) { + return new DelayPrompt(); + } else if (input.equalsIgnoreCase("19")) { + if (context.getSessionData(pref + "delay") == null) { context.getForWhom().sendRawMessage(RED + "You must set a delay first!"); return new CreateStagePrompt(stageNum, questFactory, citizens); - }else + } else { return new DelayMessagePrompt(); - } else if (input.equalsIgnoreCase("18")) { - if(questFactory.quests.denizen == null){ + } + } else if (input.equalsIgnoreCase("20")) { + if (questFactory.quests.denizen == null) { context.getForWhom().sendRawMessage(RED + "Denizen is not installed!"); return new CreateStagePrompt(stageNum, questFactory, citizens); - }else + } else { return new DenizenPrompt(); - } else if (input.equalsIgnoreCase("19")) { + } + } else if (input.equalsIgnoreCase("21")) { return new DeletePrompt(); - } else if (input.equalsIgnoreCase("20")) { + } else if (input.equalsIgnoreCase("22")) { return new StagesPrompt(questFactory); } else { return new CreateStagePrompt(stageNum, questFactory, citizens); @@ -1565,10 +1607,8 @@ public class CreateStagePrompt extends FixedSetPrompt { if (Quester.prettyEnchantmentString(e).equalsIgnoreCase(s)) { - System.out.println("Found a match: \"" + Quester.prettyEnchantmentString(e) + "\" matches \"" + s + "\""); if (enchs.contains(s) == false) { enchs.add(Quester.prettyEnchantmentString(e)); - System.out.println("added \"" + e.getName() + "\""); valid = true; break; } else { @@ -1688,23 +1728,40 @@ public class CreateStagePrompt extends FixedSetPrompt { public DeliveryListPrompt() { - super("1", "2", "3", "4", "5", "6"); + super("1", "2", "3", "4", "5"); } @Override public String getPromptText(ConversationContext context) { + // Check/add newly made item + if(context.getSessionData("newItem") != null){ + if(context.getSessionData(pref + "deliveryItems") != null){ + List itemRews = getItems(context); + itemRews.add((ItemStack) context.getSessionData("tempStack")); + context.setSessionData(pref + "deliveryItems", itemRews); + }else{ + LinkedList itemRews = new LinkedList(); + itemRews.add((ItemStack) context.getSessionData("tempStack")); + context.setSessionData(pref + "deliveryItems", itemRews); + } + + context.setSessionData("newItem", null); + context.setSessionData("tempStack", null); + + } + String text = GOLD + "- Deliver Items -\n"; - if (context.getSessionData(pref + "deliveryIds") == null) { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs (None set)\n"; - text += GRAY + "2 - Set item amounts (No item IDs set)\n"; - text += GRAY + "3 - Set NPC IDs (No item IDs set)\n"; + if (context.getSessionData(pref + "deliveryItems") == null) { + text += GRAY + " (" + Lang.get("noneSet") + ")\n"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Add item\n"; + text += GRAY + "2 - Set NPC IDs (No items set)\n"; if (context.getSessionData(pref + "deliveryMessages") == null) { - text += BLUE + "4 - Set delivery messages (None set)\n"; + text += BLUE + "3 - Set delivery messages (None set)\n"; } else { - text += BLUE + "4 - Set delivery messages\n"; + text += BLUE + "3 - Set delivery messages\n"; for (String s : getDeliveryMessages(context)) { text += GRAY + " - " + AQUA + "\"" + s + "\""; @@ -1712,35 +1769,23 @@ public class CreateStagePrompt extends FixedSetPrompt { } } - text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Clear\n"; + text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Done"; } else { - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs\n"; - for (int i : getDeliveryIds(context)) { + for (ItemStack is : getItems(context)) { - text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + "\n"; - - } - - if (context.getSessionData(pref + "deliveryAmounts") == null) { - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts (None set)\n"; - } else { - - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts\n"; - for (Integer i : getDeliveryAmounts(context)) { - - text += GRAY + " - " + AQUA + i + "\n"; - - } + text += GRAY + " - " + ItemUtil.getDisplayString(is) + "\n"; } + + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Add item\n"; if (context.getSessionData(pref + "deliveryNPCs") == null) { - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set NPC IDs (None set)\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set NPC IDs (None set)\n"; } else { - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set NPC IDs\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set NPC IDs\n"; for (int i : getDeliveryNPCs(context)) { text += GRAY + " - " + AQUA + i + " (" + citizens.getNPCRegistry().getById(i).getName() + ")\n"; @@ -1750,20 +1795,20 @@ public class CreateStagePrompt extends FixedSetPrompt { } if (context.getSessionData(pref + "deliveryMessages") == null) { - text += BLUE + "4 - Set delivery messages (None set)\n"; + text += BLUE + "3 - Set delivery messages (None set)\n"; } else { - text += BLUE + "4 - Set delivery messages\n"; + text += BLUE + "3 - Set delivery messages\n"; for (String s : getDeliveryMessages(context)) { - text += GRAY + " - " + AQUA + "\"" + s + "\""; + text += GRAY + " - " + AQUA + "\"" + s + "\"\n"; } } - text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Clear\n"; + text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Done"; } @@ -1775,38 +1820,29 @@ public class CreateStagePrompt extends FixedSetPrompt { protected Prompt acceptValidatedInput(ConversationContext context, String input) { if (input.equalsIgnoreCase("1")) { - return new DeliveryIdsPrompt(); + return new ItemStackPrompt(DeliveryListPrompt.this); } else if (input.equalsIgnoreCase("2")) { - if (context.getSessionData(pref + "deliveryIds") == null) { - context.getForWhom().sendRawMessage(RED + "You must set item ids first!"); - return new DeliveryListPrompt(); - } else { - return new DeliveryAmountsPrompt(); - } - } else if (input.equalsIgnoreCase("3")) { - if (context.getSessionData(pref + "deliveryIds") == null) { - context.getForWhom().sendRawMessage(RED + "You must set item ids first!"); + if (context.getSessionData(pref + "deliveryItems") == null) { + context.getForWhom().sendRawMessage(RED + "You must add items first!"); return new DeliveryListPrompt(); } else { return new DeliveryNPCsPrompt(); } - } else if (input.equalsIgnoreCase("4")) { + } else if (input.equalsIgnoreCase("3")) { return new DeliveryMessagesPrompt(); - } else if (input.equalsIgnoreCase("5")) { + } else if (input.equalsIgnoreCase("4")) { context.getForWhom().sendRawMessage(YELLOW + "Delivery objective cleared."); - context.setSessionData(pref + "deliveryIds", null); - context.setSessionData(pref + "deliveryAmounts", null); + context.setSessionData(pref + "deliveryItems", null); context.setSessionData(pref + "deliveryNPCs", null); context.setSessionData(pref + "deliveryMessages", null); return new DeliveryListPrompt(); - } else if (input.equalsIgnoreCase("6")) { + } else if (input.equalsIgnoreCase("5")) { int one; int two; - int three; - if (context.getSessionData(pref + "deliveryIds") != null) { - one = ((List) context.getSessionData(pref + "deliveryIds")).size(); + if (context.getSessionData(pref + "deliveryItems") != null) { + one = ((List) context.getSessionData(pref + "deliveryItems")).size(); } else { one = 0; } @@ -1817,13 +1853,7 @@ public class CreateStagePrompt extends FixedSetPrompt { two = 0; } - if (context.getSessionData(pref + "deliveryAmounts") != null) { - three = ((List) context.getSessionData(pref + "deliveryAmounts")).size(); - } else { - three = 0; - } - - if (one == two && two == three) { + if (one == two) { if (context.getSessionData(pref + "deliveryMessages") == null && one != 0) { context.getForWhom().sendRawMessage(RED + "You must set at least one delivery message!"); @@ -1833,7 +1863,7 @@ public class CreateStagePrompt extends FixedSetPrompt { } } else { - context.getForWhom().sendRawMessage(RED + "The list sizes are not equal!"); + context.getForWhom().sendRawMessage(RED + "The item list and NPC list are not equal in size!"); return new DeliveryListPrompt(); } } @@ -1842,12 +1872,8 @@ public class CreateStagePrompt extends FixedSetPrompt { } - private List getDeliveryIds(ConversationContext context) { - return (List) context.getSessionData(pref + "deliveryIds"); - } - - private List getDeliveryAmounts(ConversationContext context) { - return (List) context.getSessionData(pref + "deliveryAmounts"); + private List getItems(ConversationContext context) { + return (List) context.getSessionData(pref + "deliveryItems"); } private List getDeliveryNPCs(ConversationContext context) { @@ -1859,105 +1885,6 @@ public class CreateStagePrompt extends FixedSetPrompt { } } - private class DeliveryIdsPrompt extends StringPrompt { - - @Override - public String getPromptText(ConversationContext context) { - - return YELLOW + "Enter item IDs, separating each one by a space, or enter \'cancel\' to return."; - } - - @Override - public Prompt acceptInput(ConversationContext context, String input) { - - if (input.equalsIgnoreCase("cancel") == false) { - - String[] args = input.split(" "); - LinkedList ids = new LinkedList(); - for (String s : args) { - - try { - - Integer i = Integer.parseInt(s); - - if (Material.getMaterial(i) != null) { - - if (ids.contains(i) == false) { - ids.add(i); - } else { - context.getForWhom().sendRawMessage(RED + " List contains duplicates!"); - return new DeliveryIdsPrompt(); - } - - } else { - context.getForWhom().sendRawMessage(PINK + s + RED + " is not a valid item ID!"); - return new DeliveryIdsPrompt(); - } - - } catch (Exception e) { - - context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!"); - return new DeliveryIdsPrompt(); - - } - - } - - context.setSessionData(pref + "deliveryIds", ids); - - } - - return new DeliveryListPrompt(); - - } - } - - private class DeliveryAmountsPrompt extends StringPrompt { - - @Override - public String getPromptText(ConversationContext context) { - - return YELLOW + "Enter item amounts, separating each one by a space, or enter \'cancel\' to return."; - } - - @Override - public Prompt acceptInput(ConversationContext context, String input) { - - if (input.equalsIgnoreCase("cancel") == false) { - - String[] args = input.split(" "); - LinkedList amounts = new LinkedList(); - for (String s : args) { - - try { - - Integer i = Integer.parseInt(s); - - if (i > 0) { - amounts.add(i); - } else { - context.getForWhom().sendRawMessage(PINK + "" + i + RED + " is not greater than zero!"); - return new DeliveryAmountsPrompt(); - } - - } catch (Exception e) { - - context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!"); - return new DeliveryAmountsPrompt(); - - } - - } - - context.setSessionData(pref + "deliveryAmounts", amounts); - - } - - return new DeliveryListPrompt(); - - } - } - private class DeliveryNPCsPrompt extends StringPrompt { @Override @@ -2081,6 +2008,195 @@ public class CreateStagePrompt extends FixedSetPrompt { } } + private class NPCKillListPrompt extends FixedSetPrompt { + + public NPCKillListPrompt() { + + super("1", "2", "3", "4"); + + } + + @Override + public String getPromptText(ConversationContext context) { + + String text = GOLD + "- Kill NPCs -\n"; + if (context.getSessionData(pref + "npcIdsToKill") == null) { + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set NPC IDs (None set)\n"; + text += GRAY + "2 - Set kill amounts (No IDs set)\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; + } else { + + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set kill IDs\n"; + for (Integer i : getNPCIds(context)) { + + text += GRAY + " - " + AQUA + citizens.getNPCRegistry().getById(i).getName() + DARKAQUA + " (" + i + ")\n"; + + } + + if (context.getSessionData(pref + "npcAmountsToKill") == null) { + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set kill amounts (None set)\n"; + } else { + + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set kill amounts\n"; + for (Integer i : getKillAmounts(context)) { + + text += GRAY + " - " + BLUE + i + "\n"; + + } + + } + + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; + + } + + return text; + + } + + @Override + protected Prompt acceptValidatedInput(ConversationContext context, String input) { + + if (input.equalsIgnoreCase("1")) { + return new npcIdsToKillPrompt(); + } else if (input.equalsIgnoreCase("2")) { + if (context.getSessionData(pref + "npcIdsToKill") == null) { + context.getForWhom().sendRawMessage(RED + "You must set NPC IDs first!"); + return new NPCKillListPrompt(); + } else { + return new npcAmountsToKillPrompt(); + } + } else if (input.equalsIgnoreCase("3")) { + context.getForWhom().sendRawMessage(YELLOW + "Kill NPCs objective cleared."); + context.setSessionData(pref + "npcIdsToKill", null); + context.setSessionData(pref + "npcAmountsToKill", null); + return new NPCKillListPrompt(); + } else if (input.equalsIgnoreCase("4")) { + + int one; + int two; + + if (context.getSessionData(pref + "npcIdsToKill") != null) { + one = ((List) context.getSessionData(pref + "npcIdsToKill")).size(); + } else { + one = 0; + } + + if (context.getSessionData(pref + "npcAmountsToKill") != null) { + two = ((List) context.getSessionData(pref + "npcAmountsToKill")).size(); + } else { + two = 0; + } + + if (one == two) { + return new CreateStagePrompt(stageNum, questFactory, citizens); + } else { + context.getForWhom().sendRawMessage(RED + "The " + GOLD + "NPC IDs list" + RED + " and " + GOLD + " kill amounts list " + RED + "are not the same size!"); + return new NPCKillListPrompt(); + } + } + return null; + + } + + private List getNPCIds(ConversationContext context) { + return (List) context.getSessionData(pref + "npcIdsToKill"); + } + + private List getKillAmounts(ConversationContext context) { + return (List) context.getSessionData(pref + "npcAmountsToKill"); + } + } + + private class npcIdsToKillPrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext context) { + + return YELLOW + "Enter NPC IDs, separating each one by a space, or enter \'cancel\' to return."; + } + + @Override + public Prompt acceptInput(ConversationContext context, String input) { + + if (input.equalsIgnoreCase("cancel") == false) { + + String[] args = input.split(" "); + LinkedList npcs = new LinkedList(); + for (String s : args) { + + try { + + Integer i = Integer.parseInt(s); + + if (citizens.getNPCRegistry().getById(i) != null) { + npcs.add(i); + } else { + context.getForWhom().sendRawMessage(PINK + "" + i + RED + " is not a valid NPC ID!"); + return new npcIdsToKillPrompt(); + } + + } catch (Exception e) { + + context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!"); + return new npcIdsToKillPrompt(); + + } + + } + + context.setSessionData(pref + "npcIdsToKill", npcs); + + } + + return new NPCKillListPrompt(); + + } + } + + private class npcAmountsToKillPrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext context) { + return YELLOW + "Enter kill amounts (numbers), separating each one by a space, or enter \'cancel\' to return."; + } + + @Override + public Prompt acceptInput(ConversationContext context, String input) { + + if (input.equalsIgnoreCase("cancel") == false) { + + String[] args = input.split(" "); + LinkedList amounts = new LinkedList(); + for (String s : args) { + + try { + + if (Integer.parseInt(s) > 0) { + amounts.add(Integer.parseInt(s)); + } else { + context.getForWhom().sendRawMessage(PINK + s + RED + " is not greater than 0!"); + return new npcAmountsToKillPrompt(); + } + + } catch (Exception e) { + context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!"); + return new npcAmountsToKillPrompt(); + } + + } + + context.setSessionData(pref + "npcAmountsToKill", amounts); + + } + + return new NPCKillListPrompt(); + + } + } + private class MobListPrompt extends FixedSetPrompt { public MobListPrompt() { @@ -3287,7 +3403,6 @@ public class CreateStagePrompt extends FixedSetPrompt { } } - private class DelayPrompt extends StringPrompt { @Override @@ -3306,11 +3421,11 @@ public class CreateStagePrompt extends FixedSetPrompt { long l; - try{ + try { l = Long.parseLong(input); - }catch(Exception e){ + } catch (Exception e) { player.sendMessage(YELLOW + "Input was not a number!"); return new DelayPrompt(); } @@ -3335,7 +3450,6 @@ public class CreateStagePrompt extends FixedSetPrompt { } } - private class DelayMessagePrompt extends StringPrompt { @Override @@ -3366,7 +3480,6 @@ public class CreateStagePrompt extends FixedSetPrompt { } } - private class DenizenPrompt extends StringPrompt { @Override @@ -3374,8 +3487,9 @@ public class CreateStagePrompt extends FixedSetPrompt { String text = DARKAQUA + "- Denizen Scripts -"; - for(String s : ScriptRegistry._getScriptNames()) + for (String s : ScriptRegistry._getScriptNames()) { text += AQUA + "- " + s + "\n"; + } return YELLOW + "Enter script name, or enter \"clear\" to clear the script, or \"cancel\" to return"; @@ -3388,12 +3502,12 @@ public class CreateStagePrompt extends FixedSetPrompt { if (input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false) { - if(ScriptRegistry.containsScript(input)){ + if (ScriptRegistry.containsScript(input)) { context.setSessionData(pref + "denizen", ScriptRegistry.getScriptContainer(input).getName()); return new CreateStagePrompt(stageNum, questFactory, citizens); - }else{ + } else { player.sendMessage(RED + "Denizen script not found!"); return new DenizenPrompt(); @@ -3411,6 +3525,197 @@ public class CreateStagePrompt extends FixedSetPrompt { } } + private class EpicBossListPrompt extends FixedSetPrompt { + + public EpicBossListPrompt() { + super("1", "2", "3", "4"); + } + + @Override + public String getPromptText(ConversationContext cc) { + String text = GOLD + "- " + DARKRED + "Kill Bosses" + GOLD + " -\n"; + + if (cc.getSessionData(pref + "bossIds") == null) { + text += BOLD + "" + RED + "1 " + RESET + RED + "- Set Bosses (None Set)\n"; + } else { + text += BOLD + "" + RED + "1 " + RESET + RED + "- Set Bosses\n"; + LinkedList ids = (LinkedList) cc.getSessionData(pref + "bossIds"); + for (String id : ids) { + + for (LoadBoss b : Quests.epicBoss.BossLoadList) { + + if (b.getName().equalsIgnoreCase(id)) { + text += GOLD + " - " + YELLOW + b.getName() + "\n"; + break; + } + + } + + + } + } + + if (cc.getSessionData(pref + "bossAmounts") == null) { + text += BOLD + "" + RED + "2 " + RESET + RED + "- Set kill amounts (None Set)\n"; + } else { + text += BOLD + "" + RED + "2 " + RESET + RED + "- Set kill amounts\n"; + LinkedList amounts = (LinkedList) cc.getSessionData(pref + "bossAmounts"); + for (int amount : amounts) { + text += GOLD + " - " + YELLOW + amount + "\n"; + } + } + + text += BOLD + "" + RED + "3 " + RESET + RED + "- Clear\n"; + text += BOLD + "" + RED + "4 " + RESET + GREEN + "- Done\n\n"; + + return text; + } + + @Override + protected Prompt acceptValidatedInput(ConversationContext cc, String input) { + + if (input.equalsIgnoreCase("1")) { + return new EpicBossIDListPrompt(); + }else if(input.equalsIgnoreCase("2")) { + return new EpicBossAmountListPrompt(); + }else if(input.equalsIgnoreCase("3")) { + + cc.setSessionData(pref + "bossIds", null); + cc.setSessionData(pref + "bossAmounts", null); + + cc.getForWhom().sendRawMessage(YELLOW + "Kill Bosses objective cleared."); + return new EpicBossListPrompt(); + + }else if(input.equalsIgnoreCase("4")) { + + int idNum = 0; + int amountNum = 0; + + if(cc.getSessionData(pref + "bossIds") != null) + idNum = ((LinkedList) cc.getSessionData(pref + "bossIds")).size(); + + if(cc.getSessionData(pref + "bossAmounts") != null) + amountNum = ((LinkedList) cc.getSessionData(pref + "bossAmounts")).size(); + + if(idNum != amountNum){ + + cc.getForWhom().sendRawMessage(RED + "Error: the lists are not the same size!"); + return new EpicBossListPrompt(); + } + + return new CreateStagePrompt(stageNum, questFactory, citizens); + } + + return new EpicBossListPrompt(); + + } + } + + private class EpicBossIDListPrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext cc) { + String text = GOLD + "- " + DARKRED + "Bosses" + GOLD + " -\n"; + if (Quests.epicBoss.BossLoadList.isEmpty()) { + text += RED + "- None\n"; + } else { + + for (LoadBoss b : Quests.epicBoss.BossLoadList) { + text += RED + " - " + b.getName() + "\n"; + } + + } + + text += "\n"; + text += YELLOW + "Enter Boss names, separating each one by a space, or 'cancel' to return."; + + return text; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String input) { + + if (input.equalsIgnoreCase("cancel") == false) { + + String[] ids = input.split(" "); + LinkedList idList = new LinkedList(); + for (String id : ids) { + + LoadBoss found = null; + + for (LoadBoss b : Quests.epicBoss.BossLoadList) { + if (b.getName().equalsIgnoreCase(input)) { + found = b; + break; + } + } + + if (found == null) { + cc.getForWhom().sendRawMessage(RED + "Error: could not find Boss with name " + id + "!"); + return new EpicBossIDListPrompt(); + } else { + if (idList.contains(found.getName())) { + cc.getForWhom().sendRawMessage(RED + "Error: list contains duplicates!"); + return new EpicBossIDListPrompt(); + } else { + idList.add(found.getName()); + } + } + + } + + cc.setSessionData(pref + "bossIds", idList); + + } + + return new EpicBossListPrompt(); + + } + } + + private class EpicBossAmountListPrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext cc) { + String text = YELLOW + "Enter kill amounts (numbers), separating each one by a space, or 'cancel' to return."; + + return text; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String input) { + + if (input.equalsIgnoreCase("cancel") == false) { + + String[] amounts = input.split(","); + LinkedList amountList = new LinkedList(); + for (String amount : amounts) { + + try { + + int i = Integer.parseInt(amount); + if(i < 1){ + cc.getForWhom().sendRawMessage(RED + "Error: " + amount + " is not greater than zero!"); + return new EpicBossAmountListPrompt(); + } + + amountList.add(i); + + } catch (Exception e) { + cc.getForWhom().sendRawMessage(RED + "Error: " + amount + " is not a number!"); + return new EpicBossAmountListPrompt(); + } + + } + + cc.setSessionData(pref + "bossAmounts", amountList); + + } + + return new EpicBossListPrompt(); + + } + } private class DeletePrompt extends StringPrompt { @@ -3419,7 +3724,7 @@ public class CreateStagePrompt extends FixedSetPrompt { String text = GREEN + "" + BOLD + "1" + RESET + "" + GREEN + " - Yes\n"; text += GREEN + "" + BOLD + "2" + RESET + "" + GREEN + " - No"; - return RED + "Are you sure you want to delete " + YELLOW + "Stage " + stageNum + RED + " of " + GOLD + context.getSessionData("questName") + RED + "?\n(Any Stages after will be shifted back one spot)\n" + text; + return RED + "Are you sure you want to delete " + YELLOW + "Stage " + stageNum + RED + " of " + GOLD + context.getSessionData("questName") + RED + "?\n(Any Stages after will be shifted back one spot)\n" + text; } diff --git a/src/me/blackvein/quests/prompts/ItemStackPrompt.java b/src/me/blackvein/quests/prompts/ItemStackPrompt.java new file mode 100644 index 000000000..82953d971 --- /dev/null +++ b/src/me/blackvein/quests/prompts/ItemStackPrompt.java @@ -0,0 +1,548 @@ +package me.blackvein.quests.prompts; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import me.blackvein.quests.ColorUtil; +import me.blackvein.quests.Quester; +import me.blackvein.quests.Quests; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.FixedSetPrompt; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class ItemStackPrompt extends FixedSetPrompt implements ColorUtil{ + + //Stores itemstack in "tempStack" context data. + //Stores id in "tempId" + //Stores amount in "tempAmount" + //Stores data in "tempData" + //Stores enchantments in "tempEnchantments" + //Stores name in "tempName" + //Stores lore in "tempLore" + + final Prompt oldPrompt; + public ItemStackPrompt(Prompt old){ + + super("0", "1", "2", "3", "4", "5", "6", "7", "8"); + oldPrompt = old; + + } + + @Override + public String getPromptText(ConversationContext cc) { + String menu = YELLOW + "- " + GOLD + "Create Item " + YELLOW + "-\n"; + if(cc.getSessionData("tempId") != null){ + String stackData = getItemData(cc); + if(stackData != null) + menu += stackData; + }else + menu += "\n"; + menu += GOLD + "" + BOLD + "0. " + RESET + "" + YELLOW + "Load item in hand\n"; + menu += YELLOW + "" + BOLD + "1. " + RESET + "" + GOLD + "Set ID\n"; + menu += YELLOW + "" + BOLD + "2. " + RESET + "" + GOLD + "Set amount\n"; + menu += YELLOW + "" + BOLD + "3. " + RESET + "" + GOLD + "Set data\n"; + menu += YELLOW + "" + BOLD + "4. " + RESET + "" + GOLD + "Add/clear enchantments\n"; + menu += YELLOW + "" + BOLD + "5. " + RESET + "" + ITALIC + GOLD + "Set name\n"; + menu += YELLOW + "" + BOLD + "6. " + RESET + "" + ITALIC + GOLD + "Set lore\n"; + menu += YELLOW + "" + BOLD + "7. " + RESET + "" + GREEN + "Done\n"; + menu += YELLOW + "" + BOLD + "8. " + RESET + "" + RED + "Cancel\n"; + return menu; + } + + @Override + protected Prompt acceptValidatedInput(ConversationContext cc, String input) { + + if(input.equalsIgnoreCase("0")){ + + Player player = (Player) cc.getForWhom(); + ItemStack is = player.getItemInHand(); + if(is == null || is.getType().equals(Material.AIR)){ + + player.sendMessage(RED + "No item in hand!"); + return new ItemStackPrompt(oldPrompt); + + }else{ + + cc.setSessionData("tempData", null); + cc.setSessionData("tempEnchantments", null); + cc.setSessionData("tempName", null); + cc.setSessionData("tempLore", null); + + cc.setSessionData("tempId", is.getTypeId()); + cc.setSessionData("tempAmount", is.getAmount()); + if(is.getDurability() != 0) + cc.setSessionData("tempData", is.getDurability()); + if(is.getEnchantments() != null && is.getEnchantments().isEmpty() == false) + cc.setSessionData("tempEnchantments", new HashMap(is.getEnchantments())); + if(is.hasItemMeta()){ + + ItemMeta meta = is.getItemMeta(); + if(meta.hasDisplayName()) + cc.setSessionData("tempName", ChatColor.stripColor(meta.getDisplayName())); + if(meta.hasLore()){ + LinkedList lore = new LinkedList(); + lore.addAll(meta.getLore()); + cc.setSessionData("tempLore", lore); + } + + + } + + player.sendMessage(GREEN + "Item loaded."); + return new ItemStackPrompt(oldPrompt); + + } + + }else if(input.equalsIgnoreCase("1")){ + return new IDPrompt(); + }else if(input.equalsIgnoreCase("2")){ + + if(cc.getSessionData("tempId") != null){ + return new AmountPrompt(); + }else{ + cc.getForWhom().sendRawMessage(RED + "You must set an ID first!"); + return new ItemStackPrompt(oldPrompt); + } + + }else if(input.equalsIgnoreCase("3")){ + + if(cc.getSessionData("tempId") != null && cc.getSessionData("tempAmount") != null){ + return new DataPrompt(); + }else{ + cc.getForWhom().sendRawMessage(RED + "You must set an ID and amount first!"); + return new ItemStackPrompt(oldPrompt); + } + + }else if(input.equalsIgnoreCase("4")){ + + if(cc.getSessionData("tempId") != null && cc.getSessionData("tempAmount") != null){ + return new EnchantmentPrompt(); + }else{ + cc.getForWhom().sendRawMessage(RED + "You must set an ID and amount first!"); + return new ItemStackPrompt(oldPrompt); + } + + }else if(input.equalsIgnoreCase("5")){ + + if(cc.getSessionData("tempId") != null && cc.getSessionData("tempAmount") != null){ + return new NamePrompt(); + }else{ + cc.getForWhom().sendRawMessage(RED + "You must set an ID and amount first!"); + return new ItemStackPrompt(oldPrompt); + } + + }else if(input.equalsIgnoreCase("6")){ + + if(cc.getSessionData("tempId") != null && cc.getSessionData("tempAmount") != null){ + return new LorePrompt(); + }else{ + cc.getForWhom().sendRawMessage(RED + "You must set an ID and amount first!"); + return new ItemStackPrompt(oldPrompt); + } + + }else if(input.equalsIgnoreCase("7")){ + + if(cc.getSessionData("tempId") != null && cc.getSessionData("tempAmount") != null){ + + int id = (Integer) cc.getSessionData("tempId"); + int amount = (Integer) cc.getSessionData("tempAmount"); + short data = -1; + Map enchs = null; + String name = null; + LinkedList lore = null; + + if(cc.getSessionData("tempData") != null) + data = (Short) cc.getSessionData("tempData"); + if(cc.getSessionData("tempEnchantments") != null) + enchs = (Map) cc.getSessionData("tempEnchantments"); + if(cc.getSessionData("tempName") != null) + name = (String) cc.getSessionData("tempName"); + if(cc.getSessionData("tempLore") != null) + lore = (LinkedList) cc.getSessionData("tempLore"); + + ItemStack stack = new ItemStack(id, amount); + ItemMeta meta = stack.getItemMeta(); + + if(data != -1) + stack.setDurability((short)data); + if(enchs != null){ + for(Entry e : enchs.entrySet()) + meta.addEnchant(e.getKey(), e.getValue(), true); + } + if(name != null) + meta.setDisplayName(name); + if(lore != null) + meta.setLore(lore); + + stack.setItemMeta(meta); + + cc.setSessionData("tempStack", stack); + cc.setSessionData("newItem", Boolean.TRUE); + + + }else{ + cc.getForWhom().sendRawMessage(RED + "You must set an ID and amount first!"); + return new ItemStackPrompt(oldPrompt); + } + + }else if(input.equalsIgnoreCase("8")) + cc.setSessionData("tempStack", null); + + cc.setSessionData("tempId", null); + cc.setSessionData("tempAmount", null); + cc.setSessionData("tempData", null); + cc.setSessionData("tempEnchantments", null); + cc.setSessionData("tempName", null); + cc.setSessionData("tempLore", null); + + try{ + return oldPrompt; + }catch (Exception e){ + cc.getForWhom().sendRawMessage(RED + "A critical error has occurred."); + return Prompt.END_OF_CONVERSATION; + } + } + + + private class IDPrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext cc) { + return YELLOW + "Enter an item ID, or \"cancel\" to return."; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String input) { + if(input.equalsIgnoreCase("cancel") == false){ + + try{ + + Material mat = Material.getMaterial(Integer.parseInt(input)); + if(mat == null){ + cc.getForWhom().sendRawMessage(RED + "Invalid item ID!"); + return new IDPrompt(); + }else{ + cc.setSessionData("tempId", Integer.parseInt(input)); + return new ItemStackPrompt(oldPrompt); + } + + }catch(Exception e){ + cc.getForWhom().sendRawMessage(RED + "Invalid item ID!"); + return new IDPrompt(); + } + + }else{ + + return new ItemStackPrompt(oldPrompt); + + } + } + + + + } + + private class AmountPrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext cc) { + return YELLOW + "Enter item amount (max. 64), or \"cancel\" to return."; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String input) { + if(input.equalsIgnoreCase("cancel") == false){ + + try{ + + int amt = Integer.parseInt(input); + if(amt < 1 || amt > 64){ + cc.getForWhom().sendRawMessage(RED + "Amount must be between 1-64!"); + return new AmountPrompt(); + }else{ + cc.setSessionData("tempAmount", Integer.parseInt(input)); + return new ItemStackPrompt(oldPrompt); + } + + }catch(Exception e){ + cc.getForWhom().sendRawMessage(RED + "Invalid input!"); + return new AmountPrompt(); + } + + }else{ + + return new ItemStackPrompt(oldPrompt); + + } + } + + } + + private class DataPrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext cc) { + return YELLOW + "Enter item data, or \"clear\" to clear the data, or \"cancel\" to return."; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String input) { + if(input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false){ + + try{ + + int amt = Integer.parseInt(input); + if(amt < 1){ + cc.getForWhom().sendRawMessage(RED + "Amount must be greater than 0! (default data is 0)"); + return new DataPrompt(); + }else{ + cc.setSessionData("tempData", Short.parseShort(input)); + return new ItemStackPrompt(oldPrompt); + } + + }catch(Exception e){ + cc.getForWhom().sendRawMessage(RED + "Invalid input!"); + return new DataPrompt(); + } + + }else if(input.equalsIgnoreCase("clear")){ + + cc.setSessionData("tempData", null); + + } + + return new ItemStackPrompt(oldPrompt); + + } + + } + + private class EnchantmentPrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext cc) { + + String text = PINK + "- " + PURPLE + "Enchantments" + PINK + " -\n"; + for (Enchantment e : Enchantment.values()) { + + text += GREEN + Quester.prettyEnchantmentString(e) + ", "; + + } + text = text.substring(0, text.length() - 1); + + + return text + "\n" + YELLOW + "Enter an enchantment name, or \"clear\" to clear the enchantments, or \"cancel\" to return."; + + } + + @Override + public Prompt acceptInput(ConversationContext cc, String input) { + + if(input.equalsIgnoreCase("clear") == false && input.equalsIgnoreCase("cancel") == false){ + + Enchantment e = Quests.getEnchantmentPretty(input); + if(e != null){ + + cc.setSessionData("tempEnchant", e); + return new LevelPrompt(Quester.prettyEnchantmentString(e)); + + }else{ + + cc.getForWhom().sendRawMessage(RED + "Invalid enchantment name!"); + return new EnchantmentPrompt(); + + } + + }else if(input.equalsIgnoreCase("clear")) + cc.setSessionData("tempEnchantments", null); + + return new ItemStackPrompt(oldPrompt); + } + + protected class LevelPrompt extends StringPrompt { + + final String enchantment; + + protected LevelPrompt(String ench){ + enchantment = ench; + } + + @Override + public String getPromptText(ConversationContext cc) { + return AQUA + "Enter a level (number) for " + enchantment; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String input) { + + try{ + + int num = Integer.parseInt(input); + if(num < 1){ + cc.getForWhom().sendRawMessage(RED + "Level must be greater than 0!"); + return new LevelPrompt(enchantment); + }else{ + + if(cc.getSessionData("tempEnchantments") != null){ + + Map enchs = (Map) cc.getSessionData("tempEnchantments"); + enchs.put((Enchantment)cc.getSessionData("tempEnchant"), num); + + }else{ + + Map enchs = new HashMap(); + enchs.put((Enchantment)cc.getSessionData("tempEnchant"), num); + + } + return new ItemStackPrompt(oldPrompt); + } + + }catch (Exception e){ + cc.getForWhom().sendRawMessage(RED + "Input was not a number!"); + e.printStackTrace(); + return new LevelPrompt(enchantment); + } + + } + + + + } + + } + + private class NamePrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext cc) { + return YELLOW + "Enter item name, or \"clear\" to clear the custom name, or \"cancel\" to return."; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String input) { + if(input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false){ + + cc.setSessionData("tempName", input); + + }else if(input.equalsIgnoreCase("clear")){ + + cc.setSessionData("tempName", null); + + } + + return new ItemStackPrompt(oldPrompt); + + } + + } + + private class LorePrompt extends StringPrompt { + + @Override + public String getPromptText(ConversationContext cc) { + return YELLOW + "Enter item lore, separating each line by a semi-colon ; or \"clear\" to clear the lore, or \"cancel\" to return."; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String input) { + if(input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false){ + + LinkedList lore = new LinkedList(); + for(String line : input.split(";")) + lore.add(line); + cc.setSessionData("tempLore", lore); + + }else if(input.equalsIgnoreCase("clear")){ + + cc.setSessionData("tempLore", null); + + } + + return new ItemStackPrompt(oldPrompt); + + } + + } + + + + + private String getItemData(ConversationContext cc){ + + if(cc.getSessionData("tempId") != null){ + + String item; + + if(cc.getSessionData("tempName") == null){ + + Integer id = (Integer) cc.getSessionData("tempId"); + item = AQUA + Quester.prettyItemString(id); + + if(cc.getSessionData("tempData") != null) + item += ":" + BLUE + (Short) cc.getSessionData("tempData"); + + }else { + + item = PINK + "" + ITALIC + (String) cc.getSessionData("tempName") + RESET + "" + GRAY + " ("; + Integer id = (Integer) cc.getSessionData("tempId"); + item += AQUA + Quester.prettyItemString(id); + if(cc.getSessionData("tempData") != null) + item += ":" + BLUE + (Short) cc.getSessionData("tempData"); + item += GRAY + ")"; + + } + + if(cc.getSessionData("tempAmount") != null) + item += GRAY + " x " + DARKAQUA + (Integer) cc.getSessionData("tempAmount"); + else + item += GRAY + " x " + DARKAQUA + "1"; + + item += "\n"; + + if(cc.getSessionData("tempEnchantments") != null){ + + Map enchantments = (Map) cc.getSessionData("tempEnchantments"); + for(Entry e : enchantments.entrySet()){ + + item += GRAY + " - " + RED + Quester.prettyEnchantmentString(e.getKey()) + " " + Quests.getNumeral(e.getValue()) + "\n"; + + } + + } + + if(cc.getSessionData("tempLore") != null){ + + List lore = (List) cc.getSessionData("tempLore"); + + item += DARKGREEN + "(Lore)\n\""; + for(String s : lore){ + + if(lore.indexOf(s) != (lore.size() - 1)) + item += DARKGREEN + "" + ITALIC + s + "\n"; + else + item += DARKGREEN + "" + ITALIC + s + "\"\n"; + + } + + } + + + item += "\n"; + return item; + + }else{ + return null; + } + + } + +} diff --git a/src/me/blackvein/quests/prompts/QuestAcceptPrompt.java b/src/me/blackvein/quests/prompts/QuestAcceptPrompt.java new file mode 100644 index 000000000..6788d2266 --- /dev/null +++ b/src/me/blackvein/quests/prompts/QuestAcceptPrompt.java @@ -0,0 +1,150 @@ +package me.blackvein.quests.prompts; + +import java.text.MessageFormat; +import java.util.LinkedList; +import me.blackvein.quests.ColorUtil; +import me.blackvein.quests.Quest; +import me.blackvein.quests.Quester; +import me.blackvein.quests.Quests; +import org.apache.commons.lang.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.conversations.Conversable; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; +import org.bukkit.entity.Player; + +public class QuestAcceptPrompt extends StringPrompt implements ColorUtil { + + final Quests plugin; + Quester quester; + LinkedList quests; + + public QuestAcceptPrompt(Quests plugin) { + + this.plugin = plugin; + } + + @Override + public String getPromptText(ConversationContext cc) { + + quests = (LinkedList) cc.getSessionData("quests"); + quester = plugin.getQuester(((Player) cc.getForWhom()).getName()); + + String npc = (String) cc.getSessionData("npc"); + String menu = YELLOW + "- " + GOLD + "Quests" + " | " + npc + YELLOW + " -\n"; + for (int i = 1; i <= quests.size(); i++) { + + Quest quest = quests.get(i - 1); + if (quester.completedQuests.contains(quest.getName())) { + menu += DARKGREEN + "" + BOLD + "" + i + ". " + RESET + "" + GREEN + "" + ITALIC + quest.getName() + RESET + "" + GREEN + " (Completed)\n"; + } else { + menu += GOLD + "" + BOLD + "" + i + ". " + RESET + "" + YELLOW + "" + ITALIC + quest.getName() + "\n"; + } + + } + + menu += GOLD + "" + BOLD + "" + (quests.size() + 1) + ". " + RESET + "" + ColorUtil.GRAY + "Cancel\n"; + menu += WHITE + "Enter an option"; + + return menu; + } + + @Override + public Prompt acceptInput(ConversationContext cc, String input) { + + int numInput = -1; + try { + numInput = Integer.parseInt(input); + } catch (Exception e) { + //Continue + } + + if (input.equalsIgnoreCase("Cancel") || numInput == (quests.size() + 1)) { + cc.getForWhom().sendRawMessage(YELLOW + "Cancelled."); + return Prompt.END_OF_CONVERSATION; + } else { + + Quest q = null; + + for (Quest quest : quests) { + + if (quest.getName().equalsIgnoreCase(input) || StringUtils.containsIgnoreCase(quest.getName(), input) || numInput == (quests.indexOf(quest) + 1)) { + q = quest; + break; + } + + } + + if (q == null) { + cc.getForWhom().sendRawMessage(RED + "Invalid Selection!"); + return new QuestAcceptPrompt(plugin); + } else { + + Player player = quester.getPlayer(); + + if (!quester.completedQuests.contains(q.name)) { + + if (quester.currentQuest == null) { + + if(q.testRequirements(quester)){ + + quester.questToTake = q.name; + + String s = extracted(quester); + player.sendMessage(s); + plugin.conversationFactory.buildConversation((Conversable) player).begin(); + + }else{ + player.sendMessage(q.failRequirements); + } + + } else if (quester.currentQuest.equals(q) == false) { + + player.sendMessage(ChatColor.YELLOW + "You may only have one active Quest."); + + } + + } else if (quester.completedQuests.contains(q.name)) { + + if (quester.currentQuest == null) { + + if (quester.getDifference(q) > 0) { + player.sendMessage(ChatColor.YELLOW + "You may not take " + ChatColor.AQUA + q.name + ChatColor.YELLOW + " again for another " + ChatColor.DARK_PURPLE + Quests.getTime(quester.getDifference(q)) + ChatColor.YELLOW + "."); + } else if (q.redoDelay < 0) { + player.sendMessage(ChatColor.YELLOW + "You have already completed " + ChatColor.AQUA + q.name + ChatColor.YELLOW + "."); + } else { + quester.questToTake = q.name; + String s = extracted(quester); + + player.sendMessage(s); + + plugin.conversationFactory.buildConversation((Conversable) player).begin(); + } + + } else if (quester.currentQuest.equals(q) == false) { + + player.sendMessage(ChatColor.YELLOW + "You may only have one active Quest."); + + } + + } + + return Prompt.END_OF_CONVERSATION; + + } + + + } + + } + + private String extracted(final Quester quester) { + return MessageFormat.format("{0}- {1}{2}{3} -\n\n{4}{5}\n", + ChatColor.GOLD, + ChatColor.DARK_PURPLE, + quester.questToTake, + ChatColor.GOLD, + ChatColor.RESET, plugin.getQuest(quester.questToTake).description); + } +} diff --git a/src/me/blackvein/quests/prompts/RequirementsPrompt.java b/src/me/blackvein/quests/prompts/RequirementsPrompt.java index 963e57952..8c85ab263 100644 --- a/src/me/blackvein/quests/prompts/RequirementsPrompt.java +++ b/src/me/blackvein/quests/prompts/RequirementsPrompt.java @@ -5,34 +5,22 @@ import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import me.blackvein.quests.ColorUtil; import me.blackvein.quests.Quest; import me.blackvein.quests.QuestFactory; import me.blackvein.quests.Quester; import me.blackvein.quests.Quests; -import org.bukkit.ChatColor; +import me.blackvein.quests.util.ItemUtil; +import me.blackvein.quests.util.Lang; import org.bukkit.Material; import org.bukkit.conversations.*; +import org.bukkit.inventory.ItemStack; -public class RequirementsPrompt extends FixedSetPrompt{ +public class RequirementsPrompt extends FixedSetPrompt implements ColorUtil{ Quests quests; - static final ChatColor BOLD = ChatColor.BOLD; - static final ChatColor AQUA = ChatColor.AQUA; - static final ChatColor DARKAQUA = ChatColor.DARK_AQUA; - static final ChatColor BLUE = ChatColor.BLUE; - static final ChatColor GOLD = ChatColor.GOLD; - static final ChatColor PINK = ChatColor.LIGHT_PURPLE; - static final ChatColor PURPLE = ChatColor.DARK_PURPLE; - static final ChatColor GREEN = ChatColor.GREEN; - static final ChatColor DARKGREEN = ChatColor.DARK_GREEN; - static final ChatColor RED = ChatColor.RED; - static final ChatColor DARKRED = ChatColor.DARK_RED; - static final ChatColor YELLOW = ChatColor.YELLOW; - static final ChatColor GRAY = ChatColor.GRAY; - static final ChatColor RESET = ChatColor.RESET; - final QuestFactory factory; public RequirementsPrompt(Quests plugin, QuestFactory qf){ @@ -51,39 +39,22 @@ public class RequirementsPrompt extends FixedSetPrompt{ text = DARKAQUA + "- " + AQUA + context.getSessionData("questName") + AQUA + " | Requirements -\n"; if(context.getSessionData("moneyReq") == null) - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set money requirement " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set money requirement " + GRAY + " (" + Lang.get("noneSet") + ")\n"; else{ int moneyReq = (Integer) context.getSessionData("moneyReq"); - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set money requirement (" + context.getSessionData("moneyReq") + " " + (moneyReq > 1 ? Quests.getCurrency(true) : Quests.getCurrency(false)) + ")\n"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set money requirement (" + moneyReq + " " + (moneyReq > 1 ? Quests.getCurrency(true) : Quests.getCurrency(false)) + ")\n"; } if(context.getSessionData("questPointsReq") == null) - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set Quest Points requirement " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set Quest Points requirement " + GRAY + " (" + Lang.get("noneSet") + ")\n"; else{ text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set Quest Points requirement " + GRAY + "(" + AQUA + context.getSessionData("questPointsReq") + " Quest Points" + GRAY + ")\n"; } - if(context.getSessionData("itemIdReqs") == null) - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set item requirements " + GRAY + "(None set)\n"; - else{ - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set item requirements\n"; - List ids = (List) context.getSessionData("itemIdReqs"); - List amounts = (List) context.getSessionData("itemAmountReqs"); - List removes = (List) context.getSessionData("removeItemReqs"); - - for(int i : ids){ - - text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + YELLOW + " x " + AQUA + amounts.get(ids.indexOf(i)); - if(removes.get(ids.indexOf(i)) == false) - text += GRAY + "(" + DARKRED + "Remove" + GRAY + ")\n"; - else - text += GRAY + "(" + DARKGREEN + "Keep" + GRAY + ")\n"; - - } - } + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set item requirements\n"; if(context.getSessionData("permissionReqs") == null) - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set permission requirements " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set permission requirements " + GRAY + " (" + Lang.get("noneSet") + ")\n"; else{ text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set permission requirements\n"; List perms = (List) context.getSessionData("permissionReqs"); @@ -96,7 +67,7 @@ public class RequirementsPrompt extends FixedSetPrompt{ } if(context.getSessionData("questReqs") == null) - text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set Quest requirements " + GRAY + "(None set)\n"; + text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set Quest requirements " + GRAY + " (" + Lang.get("noneSet") + ")\n"; else{ text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set Quest requirements\n"; List qs = (List) context.getSessionData("questReqs"); @@ -108,7 +79,7 @@ public class RequirementsPrompt extends FixedSetPrompt{ } } - if(context.getSessionData("moneyReq") == null && context.getSessionData("questPointsReq") == null && context.getSessionData("itemIdReqs") == null && context.getSessionData("permissionReqs") == null && context.getSessionData("questReqs") == null){ + if(context.getSessionData("moneyReq") == null && context.getSessionData("questPointsReq") == null && context.getSessionData("itemReqs") == null && context.getSessionData("permissionReqs") == null && context.getSessionData("questReqs") == null){ text += GRAY + "" + BOLD + "6 - " + RESET + GRAY + "Set fail requirements message (No requirements set)\n"; }else if(context.getSessionData("failMessage") == null){ text += RED + "" + BOLD + "6 - " + RESET + RED + "Set fail requirements message (Required)\n"; @@ -139,7 +110,7 @@ public class RequirementsPrompt extends FixedSetPrompt{ }else if(input.equalsIgnoreCase("6")){ return new FailMessagePrompt(); }else if(input.equalsIgnoreCase("7")){ - if(context.getSessionData("moneyReq") != null || context.getSessionData("questPointsReq") != null || context.getSessionData("itemIdReqs") != null || context.getSessionData("permissionReqs") != null || context.getSessionData("questReqs") != null){ + if(context.getSessionData("moneyReq") != null || context.getSessionData("questPointsReq") != null || context.getSessionData("itemReqs") != null || context.getSessionData("permissionReqs") != null || context.getSessionData("questReqs") != null){ if(context.getSessionData("failMessage") == null){ context.getForWhom().sendRawMessage(RED + "You must set a fail requirements message!"); @@ -300,47 +271,52 @@ public class RequirementsPrompt extends FixedSetPrompt{ public ItemListPrompt(){ - super("1", "2", "3", "4", "5"); + super("1", "2", "3", "4"); } @Override public String getPromptText(ConversationContext context){ + // Check/add newly made item + if(context.getSessionData("newItem") != null){ + if(context.getSessionData("itemReqs") != null){ + List itemRews = getItems(context); + itemRews.add((ItemStack) context.getSessionData("tempStack")); + context.setSessionData("itemReqs", itemRews); + }else{ + LinkedList itemRews = new LinkedList(); + itemRews.add((ItemStack) context.getSessionData("tempStack")); + context.setSessionData("itemReqs", itemRews); + } + + context.setSessionData("newItem", null); + context.setSessionData("tempStack", null); + + } + String text = GOLD + "- Item Requirements -\n"; - if(context.getSessionData("itemIdReqs") == null){ - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs (None set)\n"; - text += GRAY + "2 - Set item amounts (No IDs set)\n"; - text += GRAY + "3 - Set remove items (No IDs set)\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Done"; + if(context.getSessionData("itemReqs") == null){ + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Add item\n"; + text += GRAY + "2 - Set remove items (No items set)\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; }else{ - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs\n"; - for(Integer i : getItemIds(context)){ + for(ItemStack is : getItems(context)){ - text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + "\n"; - - } - - if(context.getSessionData("itemAmountReqs") == null){ - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts (None set)\n"; - }else{ - - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts\n"; - for(Integer i : getItemAmounts(context)){ - - text += GRAY + " - " + AQUA + i + "\n"; - - } + text += GRAY + " - " + ItemUtil.getDisplayString(is) + "\n"; } + + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Add item\n"; + if(context.getSessionData("removeItemReqs") == null){ - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set remove items (None set)\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set remove items (No values set)\n"; }else{ - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set remove items\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set remove items\n"; for(Boolean b : getRemoveItems(context)){ text += GRAY + " - " + AQUA + b.toString().toLowerCase() + "\n"; @@ -349,8 +325,8 @@ public class RequirementsPrompt extends FixedSetPrompt{ } - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Done"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; + text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; } @@ -362,52 +338,38 @@ public class RequirementsPrompt extends FixedSetPrompt{ protected Prompt acceptValidatedInput(ConversationContext context, String input){ if(input.equalsIgnoreCase("1")){ - return new ItemIdsPrompt(); + return new ItemStackPrompt(ItemListPrompt.this); }else if(input.equalsIgnoreCase("2")){ - if(context.getSessionData("itemIdReqs") == null){ - context.getForWhom().sendRawMessage(RED + "You must set item IDs first!"); - return new ItemListPrompt(); - }else{ - return new ItemAmountsPrompt(); - } - }else if(input.equalsIgnoreCase("3")){ - if(context.getSessionData("itemIdReqs") == null){ - context.getForWhom().sendRawMessage(RED + "You must set item IDs first!"); + if(context.getSessionData("itemReqs") == null){ + context.getForWhom().sendRawMessage(RED + "You must add at least one item first!"); return new ItemListPrompt(); }else{ return new RemoveItemsPrompt(); } - }else if(input.equalsIgnoreCase("4")){ + }else if(input.equalsIgnoreCase("3")){ context.getForWhom().sendRawMessage(YELLOW + "Item requirements cleared."); - context.setSessionData("itemIdReqs", null); - context.setSessionData("itemAmountReqs", null); + context.setSessionData("itemReqs", null); context.setSessionData("removeItemReqs", null); return new ItemListPrompt(); - }else if(input.equalsIgnoreCase("5")){ + }else if(input.equalsIgnoreCase("4")){ int one; int two; - int three; - if(context.getSessionData("itemIdReqs") != null) - one = ((List) context.getSessionData("itemIdReqs")).size(); + if(context.getSessionData("itemReqs") != null) + one = ((List) context.getSessionData("itemReqs")).size(); else one = 0; - if(context.getSessionData("itemAmountReqs") != null) - two = ((List) context.getSessionData("itemAmountReqs")).size(); + if(context.getSessionData("removeItemReqs") != null) + two = ((List) context.getSessionData("removeItemReqs")).size(); else two = 0; - if(context.getSessionData("removeItemReqs") != null) - three = ((List) context.getSessionData("removeItemReqs")).size(); - else - three = 0; - - if(one == two && two == three) + if(one == two) return new RequirementsPrompt(quests, factory); else{ - context.getForWhom().sendRawMessage(RED + "The " + GOLD + "item IDs list" + RED + ", " + GOLD + "item amounts list " + RED + "and " + GOLD + "remove items list " + RED + "are not the same size!"); + context.getForWhom().sendRawMessage(RED + "The " + GOLD + "items list " + RED + "and " + GOLD + "remove items list " + RED + "are not the same size!"); return new ItemListPrompt(); } } @@ -415,12 +377,8 @@ public class RequirementsPrompt extends FixedSetPrompt{ } - private List getItemIds(ConversationContext context){ - return (List) context.getSessionData("itemIdReqs"); - } - - private List getItemAmounts(ConversationContext context){ - return (List) context.getSessionData("itemAmountReqs"); + private List getItems(ConversationContext context){ + return (List) context.getSessionData("itemReqs"); } private List getRemoveItems(ConversationContext context){ @@ -429,98 +387,6 @@ public class RequirementsPrompt extends FixedSetPrompt{ } - private class ItemIdsPrompt extends StringPrompt { - - @Override - public String getPromptText(ConversationContext context){ - return YELLOW + "Enter item IDs, separating each one by a space, or enter \'cancel\' to return."; - } - - @Override - public Prompt acceptInput(ConversationContext context, String input){ - - if(input.equalsIgnoreCase("cancel") == false){ - - String[] args = input.split(" "); - LinkedList ids = new LinkedList(); - for(String s : args){ - - try{ - - if(Material.getMaterial(Integer.parseInt(s)) != null){ - - if(ids.contains(Integer.parseInt(s)) == false){ - ids.add(Integer.parseInt(s)); - }else{ - context.getForWhom().sendRawMessage(RED + " List contains duplicates!"); - return new ItemIdsPrompt(); - } - - }else{ - context.getForWhom().sendRawMessage(PINK + s + RED + " is not a valid item ID!"); - return new ItemIdsPrompt(); - } - - }catch (Exception e){ - context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!"); - return new ItemIdsPrompt(); - } - - } - - context.setSessionData("itemIdReqs", ids); - - } - - return new ItemListPrompt(); - - } - - } - - private class ItemAmountsPrompt extends StringPrompt { - - @Override - public String getPromptText(ConversationContext context){ - return YELLOW + "Enter item amounts (numbers), separating each one by a space, or enter \'cancel\' to return."; - } - - @Override - public Prompt acceptInput(ConversationContext context, String input){ - - if(input.equalsIgnoreCase("cancel") == false){ - - String[] args = input.split(" "); - LinkedList amounts = new LinkedList(); - for(String s : args){ - - try{ - - if(Integer.parseInt(s) > 0) - amounts.add(Integer.parseInt(s)); - else{ - context.getForWhom().sendRawMessage(PINK + s + RED + " is not greater than 0!"); - return new ItemAmountsPrompt(); - } - - }catch (Exception e){ - context.getForWhom().sendRawMessage(RED + "Invalid entry " + PINK + s + RED + ". Input was not a list of numbers!"); - return new ItemAmountsPrompt(); - } - - } - - context.setSessionData("itemAmountReqs", amounts); - - } - - return new ItemListPrompt(); - - } - - - } - private class RemoveItemsPrompt extends StringPrompt { @Override diff --git a/src/me/blackvein/quests/prompts/RewardsPrompt.java b/src/me/blackvein/quests/prompts/RewardsPrompt.java index 0fc230cdc..0b95ef958 100644 --- a/src/me/blackvein/quests/prompts/RewardsPrompt.java +++ b/src/me/blackvein/quests/prompts/RewardsPrompt.java @@ -1,146 +1,121 @@ - package me.blackvein.quests.prompts; +package me.blackvein.quests.prompts; import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import me.blackvein.quests.ColorUtil; import me.blackvein.quests.QuestFactory; import me.blackvein.quests.Quester; import me.blackvein.quests.Quests; -import org.bukkit.ChatColor; -import org.bukkit.Material; +import me.blackvein.quests.util.ItemUtil; +import me.blackvein.quests.util.Lang; import org.bukkit.conversations.*; +import org.bukkit.inventory.ItemStack; -public class RewardsPrompt extends FixedSetPrompt{ - - Quests quests; - - static final ChatColor BOLD = ChatColor.BOLD; - static final ChatColor ITALIC = ChatColor.ITALIC; - static final ChatColor AQUA = ChatColor.AQUA; - static final ChatColor DARKAQUA = ChatColor.DARK_AQUA; - static final ChatColor BLUE = ChatColor.BLUE; - static final ChatColor GOLD = ChatColor.GOLD; - static final ChatColor PINK = ChatColor.LIGHT_PURPLE; - static final ChatColor PURPLE = ChatColor.DARK_PURPLE; - static final ChatColor GREEN = ChatColor.GREEN; - static final ChatColor RED = ChatColor.RED; - static final ChatColor DARKRED = ChatColor.DARK_RED; - static final ChatColor YELLOW = ChatColor.YELLOW; - static final ChatColor GRAY = ChatColor.GRAY; - static final ChatColor RESET = ChatColor.RESET; - +public class RewardsPrompt extends FixedSetPrompt implements ColorUtil{ + + final Quests quests; + final QuestFactory factory; - + public RewardsPrompt(Quests plugin, QuestFactory qf){ - + super("1", "2", "3", "4", "5", "6", "7", "8"); quests = plugin; factory = qf; - + } - + @Override public String getPromptText(ConversationContext context){ - + String text; - + text = DARKAQUA + "- " + AQUA + context.getSessionData("questName") + AQUA + " | Rewards -\n"; - + if(context.getSessionData("moneyRew") == null) text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set money reward (None set)\n"; else{ int moneyRew = (Integer) context.getSessionData("moneyRew"); text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set money reward (" + moneyRew + " " + (moneyRew > 1 ? Quests.getCurrency(true) : Quests.getCurrency(false)) + ")\n"; } - + if(context.getSessionData("questPointsRew") == null) text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set Quest Points reward (None set)\n"; else{ text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set Quest Points reward (" + context.getSessionData("questPointsRew") + " Quest Points)\n"; } - - if(context.getSessionData("itemIdRews") == null) - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set item rewards (None set)\n"; - else{ + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Set item rewards\n"; - List ids = (List) context.getSessionData("itemIdRews"); - List amounts = (List) context.getSessionData("itemAmountRews"); - - for(int i : ids){ - - text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + YELLOW + " x " + DARKAQUA + amounts.get(ids.indexOf(i)) + "\n"; - - } - } - + if(context.getSessionData("expRew") == null) text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set experience reward (None set)\n"; else{ text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Set experience reward (" + context.getSessionData("expRew") + " points)\n"; } - + if(context.getSessionData("commandRews") == null) text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set command rewards (None set)\n"; else{ text += BLUE + "" + BOLD + "5" + RESET + YELLOW + " - Set command rewards\n"; List commands = (List) context.getSessionData("commandRews"); - + for(String cmd : commands){ - + text += GRAY + " - " + AQUA + cmd + "\n"; - + } } - + if(context.getSessionData("permissionRews") == null) text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - Set permission rewards (None set)\n"; else{ text += BLUE + "" + BOLD + "6" + RESET + YELLOW + " - Set permission rewards\n"; List permissions = (List) context.getSessionData("permissionRews"); - + for(String perm : permissions){ - + text += GRAY + " - " + AQUA + perm + "\n"; - + } } - + //mcMMO - + if(Quests.mcmmo != null){ - + if(context.getSessionData("mcMMOSkillRews") == null) text += BLUE + "" + BOLD + "7" + RESET + YELLOW + " - Set mcMMO skill rewards (None set)\n"; else{ text += BLUE + "" + BOLD + "7" + RESET + YELLOW + " - Set mcMMO skill rewards\n"; List skills = (List) context.getSessionData("mcMMOSkillRews"); List amounts = (List) context.getSessionData("mcMMOSkillAmounts"); - + for(String skill : skills){ text += GRAY + " - " + AQUA + skill + GRAY + " x " + DARKAQUA + amounts.get(skills.indexOf(skill)) + "\n"; } } - + } - + // - + if(Quests.mcmmo != null) text += GREEN + "" + BOLD + "8" + RESET + YELLOW + " - Done"; else text += GREEN + "" + BOLD + "7" + RESET + YELLOW + " - Done"; - - + + return text; - + } - + @Override protected Prompt acceptValidatedInput(ConversationContext context, String input){ - + if(input.equalsIgnoreCase("1")){ return new MoneyPrompt(); }else if(input.equalsIgnoreCase("2")){ @@ -165,21 +140,21 @@ public class RewardsPrompt extends FixedSetPrompt{ return new RewardsPrompt(quests, factory); } return null; - + } - + private class MoneyPrompt extends NumericPrompt { - + @Override public String getPromptText(ConversationContext context){ - + return YELLOW + "Enter amount of " + AQUA + (Quests.economy.currencyNamePlural().isEmpty() ? "Money" : Quests.economy.currencyNamePlural()) + YELLOW + ", or 0 to clear the money reward, or -1 to cancel"; - + } - + @Override protected Prompt acceptValidatedInput(ConversationContext context, Number input){ - + if(input.intValue() < -1){ context.getForWhom().sendRawMessage(RED + "Amount must be positive!"); return new MoneyPrompt(); @@ -187,25 +162,25 @@ public class RewardsPrompt extends FixedSetPrompt{ context.setSessionData("moneyRew", null); else if(input.intValue() != -1) context.setSessionData("moneyRew", input.intValue()); - + return new RewardsPrompt(quests, factory); - + } - + } - + private class ExperiencePrompt extends NumericPrompt { - + @Override public String getPromptText(ConversationContext context){ - + return YELLOW + "Enter amount of experience, or 0 to clear the experience reward, or -1 to cancel"; - + } - + @Override protected Prompt acceptValidatedInput(ConversationContext context, Number input){ - + if(input.intValue() < -1){ context.getForWhom().sendRawMessage(RED + "Amount must be positive!"); return new ExperiencePrompt(); @@ -213,25 +188,25 @@ public class RewardsPrompt extends FixedSetPrompt{ context.setSessionData("expRew", null); else if(input.intValue() != 0) context.setSessionData("expRew", input.intValue()); - + return new RewardsPrompt(quests, factory); - + } - + } - + private class QuestPointsPrompt extends NumericPrompt { - + @Override public String getPromptText(ConversationContext context){ - + return YELLOW + "Enter amount of Quest Points, or 0 to clear the Quest Points reward, or -1 to cancel"; - + } - + @Override protected Prompt acceptValidatedInput(ConversationContext context, Number input){ - + if(input.intValue() < -1){ context.getForWhom().sendRawMessage(RED + "Amount must be positive!"); return new QuestPointsPrompt(); @@ -239,126 +214,99 @@ public class RewardsPrompt extends FixedSetPrompt{ context.setSessionData("questPointsRew", null); else if(input.intValue() != 0) context.setSessionData("questPointsRew", input.intValue()); - + return new RewardsPrompt(quests, factory); - + } - + } - + private class ItemListPrompt extends FixedSetPrompt { - + public ItemListPrompt(){ - - super("1", "2", "3", "4"); - + + super("1", "2", "3"); + } - + @Override public String getPromptText(ConversationContext context){ - - String text = GOLD + "- Item Rewards -\n"; - if(context.getSessionData("itemIdRews") == null){ - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs (None set)\n"; - text += GRAY + "2 - Set item amounts (No IDs set)\n"; - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; - }else{ - - text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set item IDs\n"; - for(Integer i : getItemIds(context)){ - - text += GRAY + " - " + AQUA + Quester.prettyItemString(i) + "\n"; - - } - - if(context.getSessionData("itemAmountRews") == null){ - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts (None set)\n"; + + // Check/add newly made item + if(context.getSessionData("newItem") != null){ + if(context.getSessionData("itemRews") != null){ + List itemRews = getItems(context); + itemRews.add((ItemStack) context.getSessionData("tempStack")); + context.setSessionData("itemRews", itemRews); }else{ - - text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set item amounts\n"; - for(Integer i : getItemAmounts(context)){ - - text += GRAY + " - " + AQUA + i + "\n"; - - } - + LinkedList itemRews = new LinkedList(); + itemRews.add((ItemStack) context.getSessionData("tempStack")); + context.setSessionData("itemRews", itemRews); } - - text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; - text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; - + + context.setSessionData("newItem", null); + context.setSessionData("tempStack", null); + } - + + String text = GOLD + "- Item Rewards -\n"; + if(context.getSessionData("itemRews") == null){ + text += GRAY + " (" + Lang.get("noneSet") + ")\n"; + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Add item\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Clear\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Done"; + }else{ + + for(ItemStack is : getItems(context)){ + + text += GRAY + "- " + ItemUtil.getDisplayString(is) + "\n"; + + + } + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Add item\n"; + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Clear\n"; + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Done"; + + } + return text; - + } - + @Override protected Prompt acceptValidatedInput(ConversationContext context, String input){ - + if(input.equalsIgnoreCase("1")){ - return new ItemIdsPrompt(); + return new ItemStackPrompt(ItemListPrompt.this); }else if(input.equalsIgnoreCase("2")){ - if(context.getSessionData("itemIdRews") == null){ - context.getForWhom().sendRawMessage(RED + "You must set item IDs first!"); - return new ItemListPrompt(); - }else{ - return new ItemAmountsPrompt(); - } - }else if(input.equalsIgnoreCase("3")){ context.getForWhom().sendRawMessage(YELLOW + "Item rewards cleared."); - context.setSessionData("itemIdRews", null); - context.setSessionData("itemAmountRews", null); + context.setSessionData("itemRews", null); return new ItemListPrompt(); - }else if(input.equalsIgnoreCase("4")){ - - int one; - int two; - - if(context.getSessionData("itemIdRews") != null) - one = ((List) context.getSessionData("itemIdRews")).size(); - else - one = 0; - - if(context.getSessionData("itemAmountRews") != null) - two = ((List) context.getSessionData("itemAmountRews")).size(); - else - two = 0; - - if(one == two) - return new RewardsPrompt(quests, factory); - else{ - context.getForWhom().sendRawMessage(RED + "The " + GOLD + "item IDs list " + RED + "and " + GOLD + "item amounts list " + RED + "are not the same size!"); - return new ItemListPrompt(); - } + }else if(input.equalsIgnoreCase("3")){ + return new RewardsPrompt(quests, factory); } return null; - + } - - private List getItemIds(ConversationContext context){ - return (List) context.getSessionData("itemIdRews"); + + private List getItems(ConversationContext context){ + return (List) context.getSessionData("itemRews"); } - - private List getItemAmounts(ConversationContext context){ - return (List) context.getSessionData("itemAmountRews"); - } - + } - - private class ItemIdsPrompt extends StringPrompt { - + + /*private class ItemIdsPrompt extends StringPrompt { + @Override public String getPromptText(ConversationContext context){ return YELLOW + "Enter item IDs separating each one by a space, or enter \'cancel\' to return."; } - + @Override public Prompt acceptInput(ConversationContext context, String input){ - + if(input.equalsIgnoreCase("cancel") == false){ - + String[] args = input.split(" "); LinkedList ids = new LinkedList(); for(String s : args){ @@ -366,14 +314,14 @@ public class RewardsPrompt extends FixedSetPrompt{ try{ if(Material.getMaterial(Integer.parseInt(s)) != null){ - + if(ids.contains(Integer.parseInt(s)) == false){ ids.add(Integer.parseInt(s)); }else{ context.getForWhom().sendRawMessage(RED + "List contains duplicates!"); return new ItemIdsPrompt(); } - + }else{ context.getForWhom().sendRawMessage(PINK + s + RED + " is not a valid item ID!"); return new ItemIdsPrompt(); @@ -385,29 +333,29 @@ public class RewardsPrompt extends FixedSetPrompt{ } } - + context.setSessionData("itemIdRews", ids); - + } - + return new ItemListPrompt(); - + } - - } - - private class ItemAmountsPrompt extends StringPrompt { - + + }*/ + + /*private class ItemAmountsPrompt extends StringPrompt { + @Override public String getPromptText(ConversationContext context){ return YELLOW + "Enter item amounts (numbers) separating each one by a space, or enter \'cancel\' to return."; } - + @Override public Prompt acceptInput(ConversationContext context, String input){ - + if(input.equalsIgnoreCase("cancel") == false){ - + String[] args = input.split(" "); LinkedList amounts = new LinkedList(); for(String s : args){ @@ -427,99 +375,99 @@ public class RewardsPrompt extends FixedSetPrompt{ } } - + context.setSessionData("itemAmountRews", amounts); - + } - + return new ItemListPrompt(); - + } - - - } - + + + }*/ + private class CommandsPrompt extends StringPrompt { - + @Override public String getPromptText(ConversationContext context){ String note = GOLD + "\nNote: You may put to specify the player who completed the Quest. e.g. " + AQUA + BOLD + ITALIC + "smite " + RESET; return YELLOW + "Enter command rewards separating each one by a " + BOLD + "comma" + RESET + YELLOW + ", or enter \'clear\' to clear the list, or enter \'cancel\' to return." + note; } - + @Override public Prompt acceptInput(ConversationContext context, String input){ - + if(input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false){ - + String[] args = input.split(","); LinkedList commands = new LinkedList(); for(String s : args){ if(s.startsWith("/")) s = s.substring(1); - + commands.add(s); } - + context.setSessionData("commandRews", commands); - + }else if(input.equalsIgnoreCase("clear")){ context.setSessionData("commandRews", null); } - + return new RewardsPrompt(quests, factory); - + } - + } - + private class PermissionsPrompt extends StringPrompt { - + @Override public String getPromptText(ConversationContext context){ return YELLOW + "Enter permission rewards separating each one by a space, or enter \'clear\' to clear the list, or enter \'cancel\' to return."; } - + @Override public Prompt acceptInput(ConversationContext context, String input){ - + if(input.equalsIgnoreCase("cancel") == false && input.equalsIgnoreCase("clear") == false){ - + String[] args = input.split(" "); LinkedList permissions = new LinkedList(); permissions.addAll(Arrays.asList(args)); - + context.setSessionData("permissionRews", permissions); - + }else if(input.equalsIgnoreCase("clear")){ context.setSessionData("permissionRews", null); } - + return new RewardsPrompt(quests, factory); - + } - + } - - - - - + + + + + //mcMMO - + private class mcMMOListPrompt extends FixedSetPrompt { - + public mcMMOListPrompt(){ - + super("1", "2", "3", "4"); - + } - + @Override public String getPromptText(ConversationContext context){ - + String text = GOLD + "- mcMMO Rewards -\n"; if(context.getSessionData("mcMMOSkillRews") == null){ text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set skills (None set)\n"; @@ -527,43 +475,43 @@ public class RewardsPrompt extends FixedSetPrompt{ text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; }else{ - + text += BLUE + "" + BOLD + "1" + RESET + YELLOW + " - Set skills\n"; for(String s : getSkills(context)){ - + text += GRAY + " - " + AQUA + s + "\n"; - + } - + if(context.getSessionData("mcMMOAmountRews") == null){ text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set skill amounts (None set)\n"; }else{ - + text += BLUE + "" + BOLD + "2" + RESET + YELLOW + " - Set skill amounts\n"; for(Integer i : getSkillAmounts(context)){ text += GRAY + " - " + AQUA + i + "\n"; } - + } - + text += BLUE + "" + BOLD + "3" + RESET + YELLOW + " - Clear\n"; text += BLUE + "" + BOLD + "4" + RESET + YELLOW + " - Done"; - + } - + return text; - + } - + @Override protected Prompt acceptValidatedInput(ConversationContext context, String input){ - + if(input.equalsIgnoreCase("1")){ - return new ItemIdsPrompt(); + return new mcMMOSkillsPrompt(); }else if(input.equalsIgnoreCase("2")){ - if(context.getSessionData("itemIdRews") == null){ + if(context.getSessionData("mcMMOSkillRews") == null){ context.getForWhom().sendRawMessage(RED + "You must set skills first!"); return new mcMMOListPrompt(); }else{ @@ -575,20 +523,20 @@ public class RewardsPrompt extends FixedSetPrompt{ context.setSessionData("mcMMOAmountRews", null); return new mcMMOListPrompt(); }else if(input.equalsIgnoreCase("4")){ - + int one; int two; - + if(context.getSessionData("mcMMOSkillRews") != null) one = ((List) context.getSessionData("mcMMOSkillRews")).size(); else one = 0; - + if(context.getSessionData("mcMMOAmountRews") != null) two = ((List) context.getSessionData("mcMMOAmountRews")).size(); else two = 0; - + if(one == two) return new RewardsPrompt(quests, factory); else{ @@ -597,21 +545,21 @@ public class RewardsPrompt extends FixedSetPrompt{ } } return null; - + } - + private List getSkills(ConversationContext context){ - return (List) context.getSessionData("mcMMORews"); + return (List) context.getSessionData("mcMMOSkillRews"); } - + private List getSkillAmounts(ConversationContext context){ return (List) context.getSessionData("mcMMOAmountRews"); } - + } - + private class mcMMOSkillsPrompt extends StringPrompt { - + @Override public String getPromptText(ConversationContext context){ String skillList = @@ -629,16 +577,16 @@ public class RewardsPrompt extends FixedSetPrompt{ AQUA + "Taming\n" + AQUA + "Unarmed\n" + AQUA + "Woodcutting\n\n"; - + return skillList + YELLOW + "Enter mcMMO skills, separating each one by a space, or enter \'cancel\' to return." + "\n" + GOLD + "Note: The \'All\' option will give levels to all skills."; } - + @Override public Prompt acceptInput(ConversationContext context, String input){ - + if(input.equalsIgnoreCase("cancel") == false){ - + String[] args = input.split(" "); LinkedList skills = new LinkedList(); for(String s : args){ @@ -658,29 +606,29 @@ public class RewardsPrompt extends FixedSetPrompt{ } } - + context.setSessionData("mcMMOSkillRews", skills); - + } - + return new mcMMOListPrompt(); - + } - + } - + private class mcMMOAmountsPrompt extends StringPrompt { - + @Override public String getPromptText(ConversationContext context){ return YELLOW + "Enter skill amounts (numbers), separating each one by a space, or enter \'cancel\' to return."; } - + @Override public Prompt acceptInput(ConversationContext context, String input){ - + if(input.equalsIgnoreCase("cancel") == false){ - + String[] args = input.split(" "); LinkedList amounts = new LinkedList(); for(String s : args){ @@ -700,16 +648,16 @@ public class RewardsPrompt extends FixedSetPrompt{ } } - - context.setSessionData("mcMMOAmountRews", amounts); - + + context.setSessionData("mcMMOSkillAmounts", amounts); + } - + return new mcMMOListPrompt(); - + } - - + + } - + } diff --git a/src/me/blackvein/quests/prompts/StagesPrompt.java b/src/me/blackvein/quests/prompts/StagesPrompt.java index 1c86ca4b1..21e7f02da 100644 --- a/src/me/blackvein/quests/prompts/StagesPrompt.java +++ b/src/me/blackvein/quests/prompts/StagesPrompt.java @@ -1,30 +1,15 @@ package me.blackvein.quests.prompts; +import me.blackvein.quests.ColorUtil; import me.blackvein.quests.QuestFactory; -import org.bukkit.ChatColor; import org.bukkit.conversations.ConversationContext; import org.bukkit.conversations.Prompt; import org.bukkit.conversations.StringPrompt; -public class StagesPrompt extends StringPrompt{ +public class StagesPrompt extends StringPrompt implements ColorUtil{ private final QuestFactory questFactory; - static final ChatColor BOLD = ChatColor.BOLD; - static final ChatColor ITALIC = ChatColor.ITALIC; - static final ChatColor AQUA = ChatColor.AQUA; - static final ChatColor DARKAQUA = ChatColor.DARK_AQUA; - static final ChatColor BLUE = ChatColor.BLUE; - static final ChatColor GOLD = ChatColor.GOLD; - static final ChatColor PINK = ChatColor.LIGHT_PURPLE; - static final ChatColor PURPLE = ChatColor.DARK_PURPLE; - static final ChatColor GREEN = ChatColor.GREEN; - static final ChatColor RED = ChatColor.RED; - static final ChatColor DARKRED = ChatColor.DARK_RED; - static final ChatColor YELLOW = ChatColor.YELLOW; - static final ChatColor GRAY = ChatColor.GRAY; - static final ChatColor RESET = ChatColor.RESET; - public StagesPrompt(QuestFactory qf){ questFactory = qf; @@ -143,13 +128,15 @@ public class StagesPrompt extends StringPrompt{ cc.setSessionData(newPref + "enchantIds", cc.getSessionData(pref + "enchantIds")); cc.setSessionData(newPref + "enchantAmounts", cc.getSessionData(pref + "enchantAmounts")); - cc.setSessionData(newPref + "deliveryIds", cc.getSessionData(pref + "deliveryIds")); - cc.setSessionData(newPref + "deliveryAmounts", cc.getSessionData(pref + "deliveryAmounts")); + cc.setSessionData(newPref + "deliveryItems", cc.getSessionData(pref + "deliveryItems")); cc.setSessionData(newPref + "deliveryNPCs", cc.getSessionData(pref + "deliveryNPCs")); cc.setSessionData(newPref + "deliveryMessages", cc.getSessionData(pref + "deliveryMessages")); cc.setSessionData(newPref + "npcIdsToTalkTo", cc.getSessionData(pref + "npcIdsToTalkTo")); + cc.setSessionData(newPref + "npcIdsToKill", cc.getSessionData(pref + "npcIdsToKill")); + cc.setSessionData(newPref + "npcAmountsToKill", cc.getSessionData(pref + "npcAmountsToKill")); + cc.setSessionData(newPref + "mobTypes", cc.getSessionData(pref + "mobTypes")); cc.setSessionData(newPref + "mobAmounts", cc.getSessionData(pref + "mobAmounts")); cc.setSessionData(newPref + "killLocations", cc.getSessionData(pref + "killLocations")); @@ -199,13 +186,15 @@ public class StagesPrompt extends StringPrompt{ cc.setSessionData(pref + "enchantIds", null); cc.setSessionData(pref + "enchantAmounts", null); - cc.setSessionData(pref + "deliveryIds", null); - cc.setSessionData(pref + "deliveryAmounts", null); + cc.setSessionData(pref + "deliveryItems", null); cc.setSessionData(pref + "deliveryNPCs", null); cc.setSessionData(pref + "deliveryMessages", null); cc.setSessionData(pref + "npcIdsToTalkTo", null); + cc.setSessionData(pref + "npcIdsToKill", null); + cc.setSessionData(pref + "npcAmountsToKill", null); + cc.setSessionData(pref + "mobTypes", null); cc.setSessionData(pref + "mobAmounts", null); cc.setSessionData(pref + "killLocations", null); diff --git a/src/me/blackvein/quests/rules b/src/me/blackvein/quests/rules new file mode 100644 index 000000000..66b894ed6 --- /dev/null +++ b/src/me/blackvein/quests/rules @@ -0,0 +1,8 @@ +- Do NOT translate the texts on the left-hand side, only the ones on the right. + Example: Translate "Event Editor", NOT "eventEditorTitle" +- Keep all capitalization in phrases (if the first word is capitalized, keep it that way) +- Keep all punctuation (if there is a period at the end of a phrase, keep it there. If there isn't, don't add one etc.) +- Keep all brackets, parentheses and quotation marks. +- The ___ 's just mean that there is a number or something before the phrase, it is just so you can understand the context. + Example: "___ is not a number!" just means that when the actual message is printed out, something will be put in place of the ___, + so keep that in mind when you are translating. \ No newline at end of file diff --git a/src/me/blackvein/quests/stageDataNames.txt b/src/me/blackvein/quests/stageDataNames.txt index 18cd5dd7c..0addd757a 100644 --- a/src/me/blackvein/quests/stageDataNames.txt +++ b/src/me/blackvein/quests/stageDataNames.txt @@ -28,12 +28,22 @@ stage#deliveryMessages stage#npcIdsToTalkTo +stage#npcIdsToKill +stage#npcAmountsToKill + stage#mobTypes stage#mobAmounts stage#killLocations stage#killLocationRadii stage#killLocationNames +stage#bossIds +stage#bossAmounts +^^^^ +boss-ids-to-kill +boss-amounts-to-kill +^^^^ + stage#reachLocations stage#reachLocationRadii stage#reachLocationNames diff --git a/src/me/blackvein/quests/util/ItemUtil.java b/src/me/blackvein/quests/util/ItemUtil.java new file mode 100644 index 000000000..f0dd7bbef --- /dev/null +++ b/src/me/blackvein/quests/util/ItemUtil.java @@ -0,0 +1,193 @@ +package me.blackvein.quests.util; + +import java.util.LinkedList; +import java.util.Map.Entry; +import me.blackvein.quests.ColorUtil; +import me.blackvein.quests.Quester; +import me.blackvein.quests.Quests; +import org.bukkit.ChatColor; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class ItemUtil implements ColorUtil{ + + /** + * Will compare stacks by id, amount, data, name/lore and enchantments + * + * + * @param one ItemStack to compare + * @param two ItemStack to compare to + * @return 0 if stacks are equal, or the first inequality from the following values:
+ * @return -1 -> stack ids are unequal
+ * @return -2 -> stack amounts are unequal
+ * @return -3 -> stack data is unequal
+ * @return -4 -> stack name/lore is unequal
+ * @return -5 -> stack enchantments are unequal
+ */ + public static int compareItems(ItemStack one, ItemStack two, boolean ignoreAmount){ + + if(one.getTypeId() != two.getTypeId()) + return -1; + else if( (one.getAmount() != two.getAmount()) && ignoreAmount == false) + return -2; + else if(one.getData().equals(two.getData()) == false) + return -3; + + if(one.hasItemMeta() || two.hasItemMeta()){ + + if(one.hasItemMeta() && two.hasItemMeta() == false) + return -4; + else if(one.hasItemMeta() == false && two.hasItemMeta()) + return -4; + + else if(one.getItemMeta().hasDisplayName() && two.getItemMeta().hasDisplayName() == false) + return -4; + else if(one.getItemMeta().hasDisplayName() == false && two.getItemMeta().hasDisplayName()) + return -4; + + else if(one.getItemMeta().hasLore() && two.getItemMeta().hasLore() == false) + return -4; + else if(one.getItemMeta().hasLore() == false && two.getItemMeta().hasLore()) + return -4; + + else if(ChatColor.stripColor(one.getItemMeta().getDisplayName()).equals(ChatColor.stripColor(two.getItemMeta().getDisplayName())) == false) + return -4; + + else if(one.getItemMeta().hasLore() && two.getItemMeta().hasLore() && one.getItemMeta().getLore().equals(two.getItemMeta().getLore()) == false) + return -4; + + } + + if(one.getEnchantments().equals(two.getEnchantments()) == false) + return -5; + else + return 0; + + } + + //Formats -> id-id:amount-amount:data-data:enchantment-enchantment level:name-name:lore-lore: + // + public static ItemStack readItemStack(String data){ + + ItemStack stack = null; + String[] args = data.split(":"); + ItemMeta meta = null; + LinkedList lore = new LinkedList(); + for(String arg : args){ + + if(arg.startsWith("id-")){ + stack = new ItemStack(Integer.parseInt(arg.substring(3))); + meta = stack.getItemMeta(); + }else if(arg.startsWith("amount-")) + stack.setAmount(Integer.parseInt(arg.substring(7))); + else if(arg.startsWith("data-")) + stack.setDurability(Short.parseShort(arg.substring(5))); + else if(arg.startsWith("enchantment-")){ + String[] enchs = arg.substring(12).split(" "); + Enchantment e = Quests.getEnchantment(enchs[0]); + meta.addEnchant(e, Integer.parseInt(enchs[1]), true); + }else if(arg.startsWith("name-")) + meta.setDisplayName(arg.substring(5)); + else if(arg.startsWith("lore-")) + lore.add(arg.substring(5)); + + + } + + if(lore.isEmpty() == false) + meta.setLore(lore); + + stack.setItemMeta(meta); + + return stack; + + } + + public static String serialize(ItemStack is){ + + String serial; + + serial = "id-" + is.getTypeId(); + serial += ":amount-" + is.getAmount(); + if(is.getDurability() != 0) + serial += ":data-" + is.getDurability(); + if(is.getEnchantments().isEmpty() == false){ + + for(Entry e : is.getEnchantments().entrySet()) + serial += ":enchantment-" + Quester.enchantmentString(e.getKey()) + " " + e.getValue(); + + } + if(is.hasItemMeta()){ + + ItemMeta meta = is.getItemMeta(); + if(meta.hasDisplayName()) + serial += ":name-" + meta.getDisplayName(); + if(meta.hasLore()){ + for(String s : meta.getLore()) + serial += ":lore-" + s; + } + + } + + + return serial; + + } + + public static String getDisplayString(ItemStack is){ + + String text; + + if(is.hasItemMeta() && is.getItemMeta().hasDisplayName()) + text = "" + DARKAQUA + ITALIC + is.getItemMeta().getDisplayName() + RESET + AQUA + " x " + is.getAmount(); + else{ + text = AQUA + Quester.prettyItemString(is.getTypeId()); + if(is.getDurability() != 0) + text += AQUA + ":" + is.getDurability(); + + text += AQUA + " x " + is.getAmount(); + + if(is.getEnchantments().isEmpty() == false) + text += " " + PURPLE + "*Enchanted*"; + + } + + return text; + + } + + public static String getString(ItemStack is){ + + String text; + + if(is.hasItemMeta() && is.getItemMeta().hasDisplayName()) + text = "" + DARKAQUA + ITALIC + is.getItemMeta().getDisplayName() + RESET + AQUA + " x " + is.getAmount(); + else{ + text = AQUA + Quester.prettyItemString(is.getTypeId()); + if(is.getDurability() != 0) + text += AQUA + ":" + is.getDurability(); + + text += AQUA + " x " + is.getAmount(); + + } + + return text; + + } + + public static String getName(ItemStack is){ + + String text; + + if(is.hasItemMeta() && is.getItemMeta().hasDisplayName()) + text = "" + DARKAQUA + ITALIC + is.getItemMeta().getDisplayName(); + else{ + text = AQUA + Quester.prettyItemString(is.getTypeId()); + } + + return text; + + } + +} diff --git a/src/me/blackvein/quests/util/Lang.java b/src/me/blackvein/quests/util/Lang.java new file mode 100644 index 000000000..3775bd916 --- /dev/null +++ b/src/me/blackvein/quests/util/Lang.java @@ -0,0 +1,244 @@ +package me.blackvein.quests.util; + +import java.util.HashMap; +import java.util.Map; + +public class Lang { + + public static String lang = "en"; + private static Map en = new HashMap(); + private static Map fr = new HashMap(); + private static Map es = new HashMap(); + private static Map de = new HashMap(); + private static Map sv = new HashMap(); + private static Map nl = new HashMap(); + private static Map pl = new HashMap(); + private static Map da = new HashMap(); + private static Map zh = new HashMap(); + private static Map no = new HashMap(); + + public static String get(String key){ + + if(lang.equals("en")) + return en.get(key); + else if(lang.equals("fr")) + return fr.get(key); + else if(lang.equals("es")) + return es.get(key); + else if(lang.equals("de")) + return de.get(key); + else if(lang.equals("sv")) + return sv.get(key); + else if(lang.equals("nl")) + return nl.get(key); + else if(lang.equals("pl")) + return pl.get(key); + else if(lang.equals("da")) + return da.get(key); + else if(lang.equals("zh")) + return zh.get(key); + else if(lang.equals("no")) + return no.get(key); + else + return en.get(key); + + } + + public static void initPhrases(){ + + //English + + //Quests + en.put("enterQuestName", "Enter Quest name (or \"cancel\" to return)"); + + + // + + + //Events + en.put("eventEditorTitle", "Event Editor"); + en.put("eventEditorCreate", "Create new Event"); + en.put("eventEditorEdit", "Edit an Event"); + en.put("eventEditorDelete", "Delete an Event"); + + en.put("eventEditorNoneToEdit", "No Events currently exist to be edited!"); + en.put("eventEditorNoneToDelete", "No Events currently exist to be deleted!"); + en.put("eventEditorNotFound", "Event not found!"); + en.put("eventEditorExists", "Event already exists!"); + en.put("eventEditorSomeone", "Someone is already creating or editing an Event with that name!"); + en.put("eventEditorAlpha", "Name must be alphanumeric!"); + + en.put("eventEditorErrorReadingFile", "Error reading Events file."); + en.put("eventEditorErrorSaving", "An error occurred while saving."); + en.put("eventEditorDeleted", "Event deleted, Quests and Events reloaded."); + en.put("eventEditorSaved", "Event saved, Quests and Events reloaded."); + + en.put("eventEditorEnterEventName", "Enter an Event name, or \"cancel\" to return."); + en.put("eventEditorDeletePrompt", "Are you sure you want to delete the Event"); + en.put("eventEditorQuitWithoutSaving", "Are you sure you want to quit without saving?"); + en.put("eventEditorFinishAndSave", "Are you sure you want to finish and save the Event"); + en.put("eventEditorModifiedNote", "Note: You have modified an Event that the following Quests use:"); + en.put("eventEditorForcedToQuit", "If you save the Event, anyone who is actively doing any of these Quests will be forced to quit them."); + + en.put("eventEditorEventInUse", "The following Quests use the Event"); + en.put("eventEditorMustModifyQuests", "eventEditorNotFound"); + en.put("eventEditorListSizeMismatch", "The lists are not the same size!"); + en.put("eventEditorListDuplicates", "List contains duplicates!"); + en.put("eventEditorNotANumberList", "Input was not a list of numbers!"); + en.put("eventEditorInvalidEntry", "Invalid entry"); + + en.put("eventEditorSetName", "Set name"); + en.put("eventEditorSetMessage", "Set message"); + + + + en.put("eventEditorClearInv", "Clear player inventory"); + en.put("eventEditorSetExplosions", "Set explosion locations"); + en.put("eventEditorSetLightning", "Set lightning strike locations"); + en.put("eventEditorSetEffects", "Set effects"); + en.put("eventEditorSetStorm", "Set storm"); + en.put("eventEditorSetThunder", "Set thunder"); + en.put("eventEditorSetMobSpawns", "Set mob spawns"); + en.put("eventEditorSetPotionEffects", "Set potion effects"); + en.put("eventEditorSetHunger", "Set player hunger level"); + en.put("eventEditorSetSaturation", "Set player saturation level"); + en.put("eventEditorSetHealth", "Set player health level"); + en.put("eventEditorSetTeleport", "Set player teleport location"); + en.put("eventEditorSetCommands", "Set commands to execute"); + + en.put("eventEditorItems", "Event Items"); + en.put("eventEditorSetItems", "Give items"); + en.put("eventEditorItemsCleared", "Event items cleared."); + en.put("eventEditorSetItemIDs", "Set item IDs"); + en.put("eventEditorSetItemAmounts", "Set item amounts"); + en.put("eventEditorNoIDs", "No IDs set"); + en.put("eventEditorMustSetIDs", "You must set item IDs first!"); + en.put("eventEditorInvalidID", "___ is not a valid item ID!"); + en.put("eventEditorNotGreaterThanZero", "___ is not greater than 0!"); + en.put("eventEditorNotANumber", "___ is not a number!"); + + en.put("eventEditorStorm", "Event Storm"); + en.put("eventEditorSetWorld", "Set world"); + en.put("eventEditorSetDuration", "Set duration"); + en.put("eventEditorNoWorld", "(No world set)"); + en.put("eventEditorSetWorldFirst", "You must set a world first!"); + en.put("eventEditorInvalidWorld", "___ is not a valid world name!"); + en.put("eventEditorMustSetStormDuration", "You must set a storm duration!"); + en.put("eventEditorStormCleared", "Storm data cleared."); + en.put("eventEditorEnterStormWorld", "Enter a world name for the storm to occur in, or enter \"cancel\" to return"); + en.put("eventEditorEnterDuration", "Enter duration (in milliseconds)"); + en.put("eventEditorAtLeastOneSecond", "Amount must be at least 1 second! (1000 milliseconds)"); + en.put("eventEditorNotGreaterThanOneSecond", "___ is not greater than 1 second! (1000 milliseconds)"); + + en.put("eventEditorThunder", "Event Thunder"); + en.put("eventEditorInvalidWorld", "___ is not a valid world name!"); + en.put("eventEditorMustSetThunderDuration", "You must set a thunder duration!"); + en.put("eventEditorThunderCleared", "Thunder data cleared."); + en.put("eventEditorEnterThunderWorld", "Enter a world name for the thunder to occur in, or enter \"cancel\" to return"); + + en.put("eventEditorEffects", "Event Effects"); + en.put("eventEditorAddEffect", "Add effect"); + en.put("eventEditorAddEffectLocation", "Add effect location"); + en.put("eventEditorNoEffects", "No effects set"); + en.put("eventEditorMustAddEffects", "You must add effects first!"); + en.put("eventEditorInvalidEffect", "___ is not a valid effect name!"); + en.put("eventEditorEffectsCleared", "Event effects cleared."); + en.put("eventEditorEffectLocationPrompt", "Right-click on a block to play an effect at, then enter \"add\" to add it to the list, or enter \"cancel\" to return"); + + en.put("eventEditorMobSpawns", "Event Mob Spawns"); + en.put("eventEditorSetMobTypes", "Set mob types"); + en.put("eventEditorNoTypesSet", "(No types set)"); + en.put("eventEditorMustSetMobTypesFirst", "You must set mob types first!"); + en.put("eventEditorSetMobAmounts", "Set mob amounts"); + en.put("eventEditorNoAmountsSet", "(No amounts set)"); + en.put("eventEditorMustSetMobAmountsFirst", "You must set mob amounts first!"); + en.put("eventEditorMustSetMobTypesAndAmountsFirst", "You must set mob types and amounts first!"); + en.put("eventEditorAddSpawnLocation", "Add spawn location"); + en.put("eventEditorMobSpawnsCleared", "Mob spawns cleared."); + en.put("eventEditorInvalidMob", "___ is not a valid mob name!"); + + en.put("eventEditorLightningPrompt", "Right-click on a block to spawn a lightning strike at, then enter \"add\" to add it to the list, or enter \"clear\" to clear the locations list, or \"cancel\" to return"); + + en.put("eventEditorPotionEffects", "Event Potion Effects"); + en.put("eventEditorSetPotionEffects", "Set potion effect types"); + en.put("eventEditorMustSetPotionTypesFirst", "You must set potion effect types first!"); + en.put("eventEditorSetPotionDurations", "Set potion effect durations"); + en.put("eventEditorMustSetPotionDurationsFirst", "You must set potion effect durations first!"); + en.put("eventEditorMustSetPotionTypesAndDurationsFirst", "You must set potion effect types and durations first!"); + en.put("eventEditorNoDurationsSet", "(No durations set)"); + en.put("eventEditorSetPotionMagnitudes", "Set potion effect magnitudes"); + en.put("eventEditorPotionsCleared", "Potion effects cleared."); + en.put("eventEditorInvalidPotionType", "___ is not a valid potion effect type!"); + + en.put("eventEditorEnterNPCId", "Enter NPC ID (or -1 to return)"); + en.put("eventEditorNoNPCExists", "No NPC exists with that id!"); + en.put("eventEditorExplosionPrompt", "Right-click on a block to spawn an explosion at, then enter \"add\" to add it to the list, or enter \"clear\" to clear the explosions list, or \"cancel\" to return"); + en.put("eventEditorSelectBlockFirst", "You must select a block first."); + en.put("eventEditorSetMessagePrompt", "Enter message, or enter \'none\' to delete, (or \'cancel\' to return)"); + en.put("eventEditorSetItemIDsPrompt", "Enter item IDs separating each one by a space, or enter \"cancel\" to return."); + en.put("eventEditorSetItemAmountsPrompt", "Enter item amounts (numbers) separating each one by a space, or enter \"cancel\" to return."); + en.put("eventEditorSetMobTypesPrompt", "Enter mob names separating each one by a space, or enter \"cancel\" to return"); + en.put("eventEditorSetMobAmountsPrompt", "Enter mob amounts separating each one by a space, or enter \"cancel\" to return"); + en.put("eventEditorMobLocationPrompt", "Right-click on a block to select it, then enter \"add\" to add it to the mob spawn location list, or enter \"cancel\" to return"); + en.put("eventEditorSetPotionEffectsPrompt", "Enter potion effect types separating each one by a space, or enter \"cancel\" to return"); + en.put("eventEditorSetPotionDurationsPrompt", "Enter effect durations (in milliseconds) separating each one by a space, or enter \"cancel\" to return"); + en.put("eventEditorSetPotionMagnitudesPrompt", "Enter potion effect magnitudes separating each one by a space, or enter \"cancel\" to return"); + en.put("eventEditorSetHungerPrompt", "Enter hunger level, or -1 to remove it"); + en.put("eventEditorHungerLevelAtLeastZero", "Hunger level must be at least 0!"); + en.put("eventEditorSetSaturationPrompt", "Enter saturation level, or -1 to remove it"); + en.put("eventEditorSaturationLevelAtLeastZero", "Saturation level must be at least 0!"); + en.put("eventEditorSetHealthPrompt", "Enter health level, or -1 to remove it"); + en.put("eventEditorHealthLevelAtLeastZero", "Health level must be at least 0!"); + en.put("eventEditorSetTeleportPrompt", "Right-click on a block to teleport the player to, then enter \"done\" to finish,\nor enter \"clear\" to clear the teleport location, or \"cancel\" to return"); + en.put("eventEditorCommandsNote", "Note: You may use to refer to the player's name."); + en.put("eventEditorSetCommandsPrompt", "Enter commands separating each one by a comma, or enter \"clear\" to clear the list, or enter \"cancel\" to return."); + en.put("eventEditorSet", ""); + en.put("eventEditorSet", ""); + en.put("eventEditorSet", ""); + + + // + + //Effects + en.put("effBlazeShoot", "Sound of a Blaze firing"); + en.put("effBowFire", "Sound of a bow firing"); + en.put("effClick1", "A click sound"); + en.put("effClick2", "A different click sound"); + en.put("effDoorToggle", "Sound of a door opening or closing"); + en.put("effExtinguish", "Sound of fire being extinguished"); + en.put("effGhastShoot", "Sound of a Ghast firing"); + en.put("effGhastShriek", "Sound of a Ghast shrieking"); + en.put("effZombieWood", "Sound of a Zombie chewing an iron door"); + en.put("effZombieIron", "Sound of a Zombie chewing a wooden door"); + en.put("effEnterName", "Enter an effect name to add it to the list, or enter \"cancel\" to return"); + + // + + //Inputs + en.put("cmdCancel", "cancel"); + en.put("cmdAdd", "add"); + en.put("cmdClear", "clear"); + en.put("cmdNone", "none"); + en.put("cmdDone", "done"); + // + + //Misc + en.put("event", "Event"); + en.put("exit", "Exit"); + en.put("exited", "Exited."); + en.put("yes", "Yes"); + en.put("no", "No"); + en.put("done", "Done"); + en.put("quit", "Quit"); + en.put("clear", "Clear"); + en.put("noneSet", "None set"); + en.put("worlds", "Worlds"); + en.put("mobs", "Mobs"); + en.put("invalidOption", "Invalid option!"); + // + // + + } + + +} diff --git a/src/me/blackvein/quests/util/ReflectionUtil.java b/src/me/blackvein/quests/util/ReflectionUtil.java new file mode 100644 index 000000000..fca9132af --- /dev/null +++ b/src/me/blackvein/quests/util/ReflectionUtil.java @@ -0,0 +1,19 @@ +package me.blackvein.quests.util; + +import java.lang.reflect.Field; + +public class ReflectionUtil { + + public static void setValue(Object instance, String fieldName, Object value) throws Exception { + Field field = instance.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(instance, value); + } + + public static Object getValue(Object instance, String fieldName) throws Exception { + Field field = instance.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(instance); + } + +} diff --git a/src/plugin.yml b/src/plugin.yml index ddcdd1142..281b8a25f 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: Quests main: me.blackvein.quests.Quests -version: 1.5.4 +version: 1.6.4 description: Player questing system website: http://dev.bukkit.org/server-mods/quests/ dev-url: https://github.com/Blackvein/Quests/ @@ -46,6 +46,9 @@ permissions: quests.admin.points: description: Set a players Quest Points default: op + quests.admin.pointsall: + description: Set all players' Quest Points + default: op quests.admin.finish: description: Immediately force Quest completion for a player default: op @@ -55,11 +58,35 @@ permissions: quests.admin.reload: description: Reload all Quests default: op + quests.editor.editor: + description: Open Quests Editor + default: op quests.editor.create: description: Create new Quests default: op - quests.editor.events: - description: Create/Edit/Delete Events + quests.editor.edit: + description: Edit Quests + default: op + quests.editor.delete: + description: Delete Quests + default: op + quests.editor.events.editor: + description: Open Events Editor + default: op + quests.editor.events.create: + description: Create new Events + default: op + quests.editor.events.edit: + description: Edit Events + default: op + quests.editor.events.delete: + description: Delete Events + default: op + quests.party.create: + description: Create/Disband Parties + default: true + quests.party.join: + description: Join parties without invitation default: op commands: quests: diff --git a/src/quests.yml b/src/quests.yml index 4af2f299e..095b17169 100644 --- a/src/quests.yml +++ b/src/quests.yml @@ -4,11 +4,10 @@ quests: ask-message: 'Could you mine 10 blocks of Stone, and deliver the 10 pieces of Cobblestone to me?.' finish-message: 'Well done. Here is your reward.' redo-delay: 1800000 + parties: 0 requirements: - item-ids: - - 270 - item-amounts: - - 1 + items: + - id-270:amount-1 remove-items: - false fail-requirement-message: 'You must have a Wooden Pickaxe first.' @@ -29,6 +28,7 @@ quests: name: 'Mob Hunter' ask-message: 'Kill an assortment of Mobs.' finish-message: 'Excellent. Here is a Diamond Sword.' + parties: 2 requirements: quests: - Stone Miner @@ -52,7 +52,7 @@ quests: - 1 rewards: - item-ids: [276] - item-amounts: [1] + items: + - id-276:amount-1 exp: 100 quest-points: 1 \ No newline at end of file