package Ġgg . r sm od . plugins . content . skills . f let ch ing . action čĊč Ċ import Ġgg . r sm od . game . fs . Definition Set č Ċ import Ġgg . r sm od . game . fs . def . Item Def č Ċ import Ġgg . r sm od . game . model . queue . Queue Task č Ċ import Ġgg . r sm od . plugins . api . Skills č Ċ import Ġgg . r sm od . plugins . api . ext .* č Ċ import Ġgg . r sm od . plugins . content . skills . f let ch ing . data . Attached čĊč Ċ /** čĊ Ġ* Ġ@ author Ġm om of 5 1 3 čĊ Ġ* čĊ Ġ* ĠHandles Ġthe Ġaction Ġof Ġatt aching Ġone Ġitem Ġto Ġanother Ġ( with Ġor Ġwithout Ġa Ġrequired Ġthird Ġitem ) čĊ Ġ*/ č Ċ class ĠAttach Action ( private Ġval Ġdefs : ĠDefinition Set ) Ġ{ čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠA Ġmap Ġof Ġattached Ġitems Ġto Ġtheir Ġitem Ġnames čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġval Ġitem Names Ġ= ĠAtt ached . attached Definitions . keys . associate Ġ{ Ġit Ġto Ġdefs . get ( Item Def :: class . java , Ġit ). name . toLowerCase () Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠA Ġmap Ġof Ġmaterial Ġids Ġto Ġtheir Ġitem Ġnames čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġval Ġmaterial Names Ġ= ĠAtt ached . attached Definitions . values . flatMap Ġ{ ĠlistOf ( it . first Material , Ġit . second Material ) Ġ}. associate Ġ{ Ġit Ġto Ġdefs . get ( Item Def :: class . java , Ġit ). name . toLowerCase () Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠHandles Ġthe Ġattachment Ġof Ġitem Ġone Ġto Ġitem Ġtwo čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* Ġ@ param Ġtask ĠĠĠĠĠ ĠThe Ġqueued Ġaction Ġtask čĊĠĠĠĠ Ġ* Ġ@ param Ġattached Ġ ĠThe Ġattached Ġdefinition čĊĠĠĠĠ Ġ* Ġ@ param Ġamount ĠĠĠ ĠThe Ġamount Ġof Ġitems Ġthe Ġplayer Ġis Ġtrying Ġto Ġmake čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġsuspend Ġfun Ġattach ( task : ĠQueue Task , Ġattached : ĠAtt ached , Ġamount : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ(! can Attach ( task , Ġattached )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊčĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġtask . player čĊĠĠĠĠĠĠĠ Ġval Ġinventory Ġ= Ġplayer . inventory čĊčĊĠĠĠĠĠĠĠ Ġval Ġfirst Material Count Ġ= Ġinventory . getItem Count ( attached . first Material ) čĊĠĠĠĠĠĠĠ Ġval Ġsecond Material Count Ġ= Ġinventory . getItem Count ( attached . second Material ) čĊĠĠĠĠĠĠĠ Ġval Ġmax Count Ġ= ĠMath . min ( Math . min ( amount , Ġfirst Material Count ), Ġsecond Material Count ) čĊčĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġtwo Ġticks Ġto Ġfollow ĠO SRS Ġbehavior čĊĠĠĠĠĠĠĠ Ġtask . wait ( 2 ) čĊĠĠĠĠĠĠĠ Ġvar Ġcompleted Ġ= Ġ 0 čĊĠĠĠĠĠĠĠ Ġwhile ( completed Ġ< Ġmax Count ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . animate ( attached . animation ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . wait ( 2 ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . lock () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġhere Ġagain Ġto Ġprevent Ġa ĠTO CT TO U Ġattack čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! can Attach ( task , Ġattached , Ġsend MessageBox Ġ= Ġfalse )){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . unlock () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Material Index Ġ= Ġinventory . getItem Index ( attached . first Material , Ġtrue ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremove First Material Ġ= Ġinventory . remove ( item Ġ= Ġattached . first Material , Ġass ure Full Removal Ġ= Ġtrue ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remove First Material . has Failed ()){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . unlock () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremove Second Material Ġ= Ġinventory . remove ( item Ġ= Ġattached . second Material , Ġass ure Full Removal Ġ= Ġtrue ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remove Second Material . has Failed ()){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinventory . add ( item Ġ= Ġattached . first Material , Ġbegin Slot Ġ= Ġfirst Material Index ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . unlock () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġinventory . add ( attached . id ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . add Xp ( Skills . F LET CH ING , Ġattached . f let ch ing XP ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted ++ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . unlock () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġuser Ġhas Ġthe Ġrequired Ġlevel , Ġone Ġof Ġeach Ġitem , Ġand Ġthe Ġrequired Ġtool Ġ( if Ġany ). čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* Ġ@ param Ġtask ĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġqueued Ġtask čĊĠĠĠĠ Ġ* Ġ@ param Ġattached ĠĠĠĠĠĠĠĠĠ ĠThe Ġattached Ġdefinition čĊĠĠĠĠ Ġ* Ġ@ param Ġsend MessageBox ĠĠĠ ĠWhether Ġor Ġnot Ġto Ġsend Ġthe Ġerror Ġmessage čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcan Attach ( task : ĠQueue Task , Ġattached : ĠAtt ached , Ġsend MessageBox : ĠBoolean Ġ= Ġtrue ) Ġ: ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġtask . player čĊĠĠĠĠĠĠĠ Ġval Ġinventory Ġ= Ġplayer . inventory čĊĠĠĠĠĠĠĠ Ġif Ġ( inventory . getItem Count ( attached . first Material ) Ġ< Ġ 1 Ġ|| Ġinventory . getItem Count ( attached . second Material ) Ġ< Ġ 1 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sendMessage Box ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . message Box (" You Ġneed Ġ${ material Names [ attached . first Material ]} Ġand Ġa Ġ${ material Names [ attached . second Material ]} Ġto Ġmake Ġa Ġ${ item Names [ attached . id ]} ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( attached . tool Required Ġ>= Ġ 0 Ġ&& Ġ! inventory . contains ( attached . tool Required )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( sendMessage Box ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . message Box (" You Ġneed Ġa Ġ${ defs . get ( Item Def :: class . java , Ġattached . tool Required ). name . toLowerCase ()} Ġto Ġattach Ġ${ material Names [ attached . first Material ]} Ġand Ġ${ material Names [ attached . second Material ]} ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( player . get Skills (). getCurrent Level ( Skills . F LET CH ING ) Ġ< Ġattached . level ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( sendMessage Box ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . message Box (" You Ġneed Ġa Ġ${ Skills . get Skill Name ( player . world , ĠSk ills . F LET CH ING )} Ġlevel Ġof Ġat Ġleast Ġ${ attached . level } Ġto Ġf let ch Ġ${ item Names [ attached . id ] }. ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠ Ġ} č Ċ }