11package dev .koifysh .archipelago ;
22
3+ import dev .koifysh .archipelago .bounce .BouncedManager ;
34import com .google .gson .JsonElement ;
45import com .google .gson .JsonObject ;
56import dev .koifysh .archipelago .events .RetrievedEvent ;
67import dev .koifysh .archipelago .flags .ItemsHandling ;
8+ import dev .koifysh .archipelago .bounce .DeathLinkHandler ;
79import dev .koifysh .archipelago .network .server .ConnectUpdatePacket ;
810import dev .koifysh .archipelago .network .server .RoomInfoPacket ;
911import dev .koifysh .archipelago .parts .DataPackage ;
1921import java .io .*;
2022import java .net .URI ;
2123import java .net .URISyntaxException ;
22- import java .nio .CharBuffer ;
2324import java .nio .charset .StandardCharsets ;
2425import java .nio .file .Files ;
2526import java .nio .file .Path ;
2627import java .nio .file .Paths ;
2728import java .util .*;
29+ import java .util .concurrent .ConcurrentHashMap ;
2830import java .util .logging .Level ;
2931import java .util .logging .Logger ;
3032
3133public abstract class Client {
3234
3335 private final static Logger LOGGER = Logger .getLogger (Client .class .getName ());
3436
37+ public static final Version protocolVersion = new Version (0 , 6 , 1 );
38+ private final static Gson gson = new Gson ();
39+
3540 private static final String OS = System .getProperty ("os.name" ).toLowerCase ();
3641
3742 private static final Path cachePath ;
@@ -69,9 +74,7 @@ else if(xdg == null || xdg.isEmpty() )
6974
7075 protected Map <String ,String > versions ;
7176
72- protected ArrayList <String > games ;
73-
74- private final static Gson gson = new Gson ();
77+ protected List <String > games ;
7578
7679 private int hintPoints ;
7780
@@ -81,31 +84,33 @@ else if(xdg == null || xdg.isEmpty() )
8184
8285 private RoomInfoPacket roomInfo ;
8386
84- private final DataPackage dataPackage ;
87+ private final DataPackage dataPackage = new DataPackage () ;
8588
8689 public static Client client ;
8790
8891 private final LocationManager locationManager ;
8992 private final ItemManager itemManager ;
9093 private final EventManager eventManager ;
91-
92- public static final Version protocolVersion = new Version ( 0 , 6 , 1 ) ;
94+ private final BouncedManager bouncedManager ;
95+ private final DeathLinkHandler deathLinkHandler ;
9396
9497 private int team ;
9598 private int slot ;
96- private HashMap <Integer , NetworkSlot > slotInfo ;
99+ private Map <Integer , NetworkSlot > slotInfo ;
97100 private String name = "Name not set" ;
98101 private String game = "Game not set" ;
99102 private String alias ;
100- private Set <String > tags = new HashSet <>();
103+ private final Set <String > tags = Collections . newSetFromMap ( new ConcurrentHashMap <>() );
101104 private int itemsHandlingFlags = 0b000;
102105
103106 public Client () {
104107 dataPackageLocation = datapackageCachePath ;
105- dataPackage = new DataPackage ();
106108 eventManager = new EventManager ();
107109 locationManager = new LocationManager (this );
108110 itemManager = new ItemManager (this );
111+ bouncedManager = new BouncedManager ();
112+ deathLinkHandler = new DeathLinkHandler (this );
113+ bouncedManager .addHandler (deathLinkHandler );
109114 client = this ;
110115 }
111116
@@ -124,7 +129,8 @@ public void setGame(String game) {
124129 */
125130 public void setTags (Set <String > tags ) {
126131 if (!this .tags .equals (tags )) {
127- this .tags = tags ;
132+ this .tags .clear ();
133+ this .tags .addAll (tags );
128134 if (isConnected ()) {
129135 ConnectUpdatePacket packet = new ConnectUpdatePacket ();
130136 packet .tags = this .tags ;
@@ -138,8 +144,7 @@ public void setTags(Set<String> tags) {
138144 * @param tag String tag to be added.
139145 */
140146 public void addTag (String tag ) {
141- if (!this .tags .contains (tag )) {
142- tags .add (tag );
147+ if (tags .add (tag )) {
143148 if (isConnected ()) {
144149 ConnectUpdatePacket packet = new ConnectUpdatePacket ();
145150 packet .tags = this .tags ;
@@ -153,8 +158,7 @@ public void addTag(String tag) {
153158 * @param tag String tag to be removed.
154159 */
155160 public void removeTag (String tag ) {
156- if (this .tags .contains (tag )) {
157- tags .remove (tag );
161+ if (tags .remove (tag )) {
158162 if (isConnected ()) {
159163 ConnectUpdatePacket packet = new ConnectUpdatePacket ();
160164 packet .tags = this .tags ;
@@ -352,7 +356,7 @@ void setTeam(int team) {
352356 this .team = team ;
353357 }
354358
355- void setSlotInfo (HashMap <Integer , NetworkSlot > slotInfo ) {
359+ void setSlotInfo (Map <Integer , NetworkSlot > slotInfo ) {
356360 this .slotInfo = slotInfo ;
357361 }
358362
@@ -388,7 +392,7 @@ public RoomInfoPacket getRoomInfo() {
388392 return roomInfo ;
389393 }
390394
391- public HashMap <Integer , NetworkSlot > getSlotInfo () {return slotInfo ;}
395+ public Map <Integer , NetworkSlot > getSlotInfo () {return slotInfo ;}
392396
393397 /**
394398 * Works exactly like {@link #connect(URI, boolean)} with allowDowngrade set to true;
@@ -629,6 +633,14 @@ public EventManager getEventManager() {
629633 return eventManager ;
630634 }
631635
636+ /**
637+ * @return the bounced packet handler
638+ */
639+ public BouncedManager getBouncedManager ()
640+ {
641+ return bouncedManager ;
642+ }
643+
632644 /**
633645 * Uses DataStorage to save a value on the AP server.
634646 *
@@ -705,4 +717,26 @@ public int dataStorageGet(Collection<String> keys) {
705717 return getPacket .getRequestID ();
706718 }
707719
720+ /**
721+ * Helper for sending a death link bounce packet. You can send these without enabling death link first, but it is frowned upon.
722+ * @param source A String that is the name of the player sending the death link (does not have to be slot name)
723+ * @param cause A String that is the cause of this death. may be empty.
724+ */
725+ public void sendDeathlink (String source , String cause )
726+ {
727+ deathLinkHandler .sendDeathLink (source , cause );
728+ }
729+
730+ /**
731+ * Enable or disable receiving death links.
732+ * @param enabled set to TRUE to enable death links, FALSE to disable.
733+ */
734+ public void setDeathLinkEnabled (boolean enabled ) {
735+ if (enabled )
736+ addTag (DeathLinkHandler .DEATHLINK_TAG );
737+ else
738+ removeTag (DeathLinkHandler .DEATHLINK_TAG );
739+ }
740+
741+
708742}
0 commit comments