@@ -769,10 +769,10 @@ public synchronized PlayerChangeInfo refreshGem(int slotId, int gemIndex, Repeat
769769
770770 // Create base list of attributes
771771 var list = new CustomIntArray ();
772+ var locked = new IntOpenHashSet ();
772773
773774 // Add locked attributes to list
774775 if (lockedAttributes .length () != 0 ) {
775- var locked = new IntOpenHashSet ();
776776 lockedAttributes .forEach (locked ::add );
777777
778778 for (int i = 0 ; i < gem .getAttributes ().length ; i ++) {
@@ -786,7 +786,7 @@ public synchronized PlayerChangeInfo refreshGem(int slotId, int gemIndex, Repeat
786786
787787 // Generate attributes and create gem
788788 var attributes = gemControl .generateAttributes (this , list );
789- gem .setNewAttributes (attributes );
789+ gem .setNewAttributes (attributes , locked );
790790
791791 // Save to database
792792 this .save ();
@@ -818,6 +818,92 @@ public boolean replaceGemAttributes(int slotId, int gemIndex) {
818818 return success ;
819819 }
820820
821+ public PlayerChangeInfo overlockGem (int slotId , int gemIndex , int attrIndex ) {
822+ // Get gem from slot
823+ var gem = this .getGemFromSlot (slotId , gemIndex );
824+ if (gem == null ) return null ;
825+
826+ // Sanity check attr index
827+ if (attrIndex < 0 || attrIndex >= gem .getAttributes ().length ) {
828+ return null ;
829+ }
830+
831+ // Get total overlock count
832+ int count = gem .getOverlockCount ();
833+
834+ if (count >= GameConstants .CHARACTER_MAX_OVERLOCK_COUNT ) {
835+ return null ;
836+ }
837+
838+ // Get gem data
839+ var gemData = this .getData ().getCharGemData (slotId );
840+ var gemControl = GameData .getCharGemSlotControlDataTable ().get (slotId );
841+
842+ if (gemControl == null ) {
843+ return null ;
844+ }
845+
846+ // Calculate the materials we need
847+ var materials = new ItemParamMap ();
848+ materials .add (gemData .getOverlockCostTid (), gemControl .getOverlockCostQty ());
849+ materials .add (GameConstants .GOLD_ITEM_ID , gemControl .getOverlockDoraCostQty ());
850+
851+ // Make sure the player has the materials to craft the emblem
852+ if (!getPlayer ().getInventory ().hasItems (materials )) {
853+ return null ;
854+ }
855+
856+ // Get attribute
857+ int attrId = gem .getAttributes ()[attrIndex ];
858+ var attr = GameData .getCharGemAttrValueDataTable ().get (attrId );
859+
860+ if (attr == null ) {
861+ return null ;
862+ }
863+
864+ // Check if we can upgrade
865+ if (gem .getOverlock ()[attrIndex ] >= attr .getOverlockCount ()) {
866+ return null ;
867+ }
868+
869+ // Upgrade overlock
870+ gem .getOverlock ()[attrIndex ]++;
871+
872+ // Consume materials
873+ var change = getPlayer ().getInventory ().removeItems (materials );
874+
875+ // Save
876+ this .save ();
877+
878+ // Success
879+ return change ;
880+ }
881+
882+ public PlayerChangeInfo revertOverlockGem (int slotId , int gemIndex , int attrIndex ) {
883+ // Get gem from slot
884+ var gem = this .getGemFromSlot (slotId , gemIndex );
885+ if (gem == null ) return null ;
886+
887+ // Sanity check attr index
888+ if (attrIndex < 0 || attrIndex >= gem .getAttributes ().length ) {
889+ return null ;
890+ }
891+
892+ // Check if we can revert
893+ if (gem .getOverlock ()[attrIndex ] <= 0 ) {
894+ return null ;
895+ }
896+
897+ // Revert overlock
898+ gem .getOverlock ()[attrIndex ]--;
899+
900+ // Save
901+ this .save ();
902+
903+ // Success
904+ return new PlayerChangeInfo ();
905+ }
906+
821907 // Proto
822908
823909 public Char toProto () {
@@ -892,7 +978,7 @@ public StarTowerChar toStarTowerProto() {
892978
893979 if (gem != null ) {
894980 info .addAllAttributes (gem .getAttributes ());
895- info .addAllOverlockCount (new int [ gem .getAttributes (). length ] );
981+ info .addAllOverlockCount (gem .getOverlock () );
896982 } else {
897983 info .addAllAttributes (new int [4 ]);
898984 info .addAllOverlockCount (new int [4 ]);
0 commit comments