@@ -79,6 +79,21 @@ public ItemStack insertSocket(@NotNull ItemStack item, @NotNull ItemStack src) {
7979 return item ;
8080 }
8181
82+ @ Override
83+ @ NotNull
84+ public List <ItemStack > extractSocket (@ NotNull ItemStack target , @ NotNull String socketId , int index ) {
85+ List <ItemStack > items = super .extractSocket (target , socketId , index );
86+ Gem gem = this .getModuleItem (target );
87+
88+ if (gem == null ) return items ;
89+
90+ ItemStack result = items .get (0 );
91+ int gemLevel = ItemStats .getLevel (target );
92+ gem .removeAbilities (result , gemLevel );
93+
94+ return items ;
95+ }
96+
8297 // -------------------------------------------------------------------- //
8398 // CLASSES
8499
@@ -128,38 +143,73 @@ private void loadAbilities(@NotNull ConfigurationSection section, int lvl) {
128143 }
129144 }
130145
131- public void applyAbilities (ItemStack item , int level ) {
146+ private void applyAbilities (ItemStack item , int level ) {
132147 List <AbilityGenerator .Ability > abilities =
133148 this .abilitiesByLevel .computeIfAbsent (level , k -> new ArrayList <>());
134149 if (abilities .isEmpty ()) return ;
135150
136151 // Start off with our old abilities and then apply the new ones on top
137- Map <String , Integer > itemAbilities = AbilityGenerator .getAbilities (item );
138- List <AbilityGenerator .Ability > abilitiesList = new ArrayList <>();
152+ Map <String , AbilityGenerator . AbilityInfo > itemAbilities = AbilityGenerator .getAbilities (item );
153+ List <AbilityGenerator .Ability > abilitiesList = new ArrayList <>();
139154 // Only add any abilities that aren't already on the item
140155 for (AbilityGenerator .Ability ability : abilities ) {
141156 if (ability == null ) continue ;
142157
143158 String abilityId = ability .getId ();
144159 if (!itemAbilities .containsKey (abilityId )) {
145- itemAbilities .put (ability .getId (), ability .getRndLevel ());
160+ itemAbilities .put (ability .getId (),
161+ new AbilityGenerator .AbilityInfo (ability .getId (), ability .getRndLevel (), "gem" ));
146162 abilitiesList .add (ability );
147163 }
148164 }
149165
150166 // Apply the new abilities to the item
151167 int i = 0 ;
152168 String [] abilityArray = new String [itemAbilities .size ()];
153- for (Map .Entry <String , Integer > entry : itemAbilities .entrySet ()) {
154- abilityArray [i ] = entry .getKey () + ":" + entry .getValue ();
169+ for (Map .Entry <String , AbilityGenerator .AbilityInfo > entry : itemAbilities .entrySet ()) {
170+ abilityArray [i ] = entry .getKey () + ":" + entry .getValue () + ":" + entry .getValue ().getSource ();
171+ i ++;
172+ }
173+ DataUT .setData (item , AbilityGenerator .ABILITY_KEY , abilityArray );
174+ updateItemLore (item , itemAbilities , abilitiesList );
175+ }
176+
177+ /**
178+ * Removes the abilities from the item that are associated with the gem at the given level.
179+ *
180+ * @param item The item to remove the abilities from.
181+ * @param level The level of the gem.
182+ */
183+ private void removeAbilities (ItemStack item , int level ) {
184+ List <AbilityGenerator .Ability > abilities = this .abilitiesByLevel .get (level );
185+ if (abilities == null ) return ;
186+
187+ Map <String , AbilityGenerator .AbilityInfo > itemAbilities = AbilityGenerator .getAbilities (item );
188+ if (itemAbilities .isEmpty ()) return ;
189+
190+ List <AbilityGenerator .Ability > abilitiesList = new ArrayList <>();
191+ for (AbilityGenerator .Ability ability : abilities ) {
192+ if (ability == null ) continue ;
193+
194+ String abilityId = ability .getId ();
195+ if (itemAbilities .containsKey (abilityId ) && itemAbilities .get (abilityId ).getSource ().equals ("gem" )) {
196+ itemAbilities .remove (abilityId );
197+ }
198+ }
199+
200+ int i = 0 ;
201+ String [] abilityArray = new String [itemAbilities .size ()];
202+ for (Map .Entry <String , AbilityGenerator .AbilityInfo > entry : itemAbilities .entrySet ()) {
203+ abilityArray [i ] =
204+ entry .getKey () + ":" + entry .getValue ().getLevel () + ":" + entry .getValue ().getSource ();
155205 i ++;
156206 }
157207 DataUT .setData (item , AbilityGenerator .ABILITY_KEY , abilityArray );
158208 updateItemLore (item , itemAbilities , abilitiesList );
159209 }
160210
161211 private void updateItemLore (ItemStack item ,
162- Map <String , Integer > itemAbilities ,
212+ Map <String , AbilityGenerator . AbilityInfo > itemAbilities ,
163213 List <AbilityGenerator .Ability > abilitiesList ) {
164214 ItemGeneratorManager .GeneratorItem genItem = Divinity .getInstance ().getModuleCache ().getTierManager ()
165215 .getModuleItem (item );
0 commit comments