1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
using Archipelago.MultiClient.Net;
using Archipelago.MultiClient.Net.Enums;
using Archipelago.MultiClient.Net.MessageLog.Messages;
using Archipelago.MultiClient.Net.Models;
using Archipelago.MultiClient.Net.Packets;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ManifoldGardenArchipelago
{
public class ArchipelagoManager
{
private ArchipelagoSession _session;
private int _itemIndex = 0;
private HashSet<string> _items = [];
private HashSet<string> _locations = [];
private bool _roomShuffle = false;
public bool RoomShuffle => _roomShuffle;
public Dictionary<EntranceIdentifier, EntranceIdentifier> EntranceMapping = [];
public async Task<LoginResult> Connect(string url, string slotName, string password)
{
LoginResult result;
try
{
_session = ArchipelagoSessionFactory.CreateSession(url);
_session.MessageLog.OnMessageReceived += OnMessageReceived;
RoomInfoPacket roomInfoPacket = await _session.ConnectAsync();
result = await _session.LoginAsync("Manifold Garden", slotName, ItemsHandlingFlags.AllItems, null, null, null, password == "" ? null : password);
}
catch (Exception ex)
{
Plugin.Logger.LogError(ex.GetBaseException().Message);
return new LoginFailure(ex.GetBaseException().Message);
}
LoginSuccessful login = result as LoginSuccessful;
if (login.SlotData.ContainsKey("connections"))
{
_roomShuffle = true;
foreach (var connection in (JArray)login.SlotData["connections"])
{
var connList = (JArray)connection;
EntranceIdentifier ei1 = new((string)connList[0], (string)connList[1]);
EntranceIdentifier ei2 = new((string)connList[2], (string)connList[3]);
EntranceMapping[ei1] = ei2;
EntranceMapping[ei2] = ei1;
}
}
return result;
}
~ArchipelagoManager()
{
Disconnect();
}
public void Disconnect()
{
if (_session == null)
{
return;
}
_session.Socket.DisconnectAsync();
_session = null;
}
public bool HasItem(string itemName)
{
return _items.Contains(itemName);
}
public void CheckLocation(string locationName)
{
if (_locations.Contains(locationName))
{
return;
}
_locations.Add(locationName);
_session.Locations.CompleteLocationChecks(_session.Locations.GetLocationIdFromName("Manifold Garden", locationName));
}
public void SendGoal()
{
_session.Socket.SendPacket(new StatusUpdatePacket()
{
Status = ArchipelagoClientState.ClientGoal,
});
Plugin.notificationManager.AddMessage("You completed your goal!");
}
public void Update()
{
if (_session == null)
{
return;
}
if (_session.Items.AllItemsReceived.Count > _itemIndex)
{
for (int i = _itemIndex; i < _session.Items.AllItemsReceived.Count; i++)
{
ItemInfo item = _session.Items.AllItemsReceived[i];
string itemName = item.ItemName;
Plugin.Logger.LogInfo($"Received {itemName}");
Plugin.notificationManager.AddMessage($"Received {itemName}");
_items.Add(itemName);
if (GameData.listenersByItem.TryGetValue(itemName, out var listeners))
{
//Plugin.Logger.LogInfo($"Evaluating for {itemName}");
GameState.EvaluateGameStateListeners(listeners);
}
}
_itemIndex = _session.Items.AllItemsReceived.Count;
/*
var hi = new StringBuilder();
foreach (var thing in chainListenersByScene)
{
hi.AppendLine(thing.Key);
foreach (var thing2 in thing.Value)
{
hi.AppendLine($" {thing2.Key}: {thing2.Value}");
}
}
Plugin.Logger.LogInfo( hi.ToString() );
*/
}
}
private void OnMessageReceived(LogMessage message)
{
if (message is ItemSendLogMessage itemSendLogMessage &&
itemSendLogMessage.IsSenderTheActivePlayer &&
!itemSendLogMessage.IsReceiverTheActivePlayer)
{
string itemName = itemSendLogMessage.Item.ItemName;
string otherPlayer = itemSendLogMessage.Receiver.Name;
string messageText = $"Sent {itemName} to {otherPlayer}";
Plugin.notificationManager.AddMessage(messageText);
}
}
}
}
|