the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "PSVita_PlayerUID.h"
3#include "..\Minecraft.World\StringHelpers.h"
4
5// taken from Boost, there is no TR1 equivalent
6template <class T>
7inline void hash_combine(std::size_t& seed, T const& v)
8{
9 hash<T> hasher;
10 seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
11}
12
13std::size_t PlayerUID::Hash::operator()(const PlayerUID& k) const
14{
15 // now only hashing against the local ID, as this is now unique across the network too.
16 std::size_t seed = 0;
17 hash_combine(seed, k.m_userID);
18 for(int i=0; i<SCE_NET_ETHER_ADDR_LEN; i++)
19 hash_combine(seed, k.m_macAddress[i]);
20
21 return seed;
22}
23
24PlayerUID::PlayerUID()
25{
26 memset(this,0,sizeof(PlayerUID));
27}
28
29
30PlayerUID::PlayerUID(int userID, SceNpOnlineId& onlineID, bool bSignedInPSN, int quadrant)
31{
32 m_userID = userID;
33 m_quadrant = quadrant;
34 setCurrentMacAddress();
35 setOnlineID(onlineID, bSignedInPSN);
36}
37
38PlayerUID::PlayerUID(wstring fromString)
39{
40 // create for the format P_5e7ff8372ea9_00000004_Mark_4J
41
42 if(fromString[0] == L'P')
43 m_quadrant = 0; // primary player, so make this zero
44 else
45 m_quadrant = 1; //'N' might not be quadrant 1, but doesn't matter here
46
47 // parse the mac address next
48 for(int i=0;i<6;i++)
49 {
50 wstring macDigit = fromString.substr(2+(i*2),2);
51 m_macAddress[i] = _fromHEXString<int>(macDigit);
52 }
53
54 // parse the userID
55 wstring userIDDigits = fromString.substr(15,8);
56 m_userID = _fromString<int>(userIDDigits);
57
58 // finally, the onlineID, if there is one
59 wstring onlineID = fromString.substr(24);
60 if(onlineID.size() > 0)
61 {
62 wcstombs(m_onlineID, onlineID.c_str(), 16);
63 m_bSignedIntoPSN = true;
64 }
65 else
66 {
67 m_onlineID[0] = 0;
68 m_bSignedIntoPSN = false;
69 }
70}
71
72
73bool PlayerUID::operator==(const PlayerUID& rhs) const
74{
75 // comparing online IDs
76 if(isSignedIntoPSN() && rhs.isSignedIntoPSN())
77 {
78 return (strcmp(m_onlineID, rhs.m_onlineID) == 0);
79 }
80 // comparing offline IDs
81 if(m_userID != rhs.m_userID)
82 return false;
83 for(int i=0; i<SCE_NET_ETHER_ADDR_LEN;i++)
84 if(m_macAddress[i] != rhs.m_macAddress[i])return false;
85 return true;
86}
87
88bool PlayerUID::operator!=(const PlayerUID& rhs)
89{
90 return !(*this==rhs);
91}
92
93void PlayerUID::setCurrentMacAddress()
94{
95 // get the mac address of this machine
96 SceNetEtherAddr etherAddr;
97 int err = sceNetGetMacAddress(ðerAddr, 0);
98 assert(err == 0);
99
100 for(int i=0;i<SCE_NET_ETHER_ADDR_LEN; i++)
101 m_macAddress[i] = etherAddr.data[i];
102}
103
104std::wstring g_testStringW;
105
106std::wstring PlayerUID::macAddressStr() const
107{
108 wchar_t macAddr[16];
109 const uint8_t* m = m_macAddress;
110 swprintf(macAddr, 16, L"%02x%02x%02x%02x%02x%02x", m[0],m[1],m[2],m[3],m[4],m[5]);
111 g_testStringW = std::wstring(macAddr);
112 return g_testStringW;
113}
114
115std::wstring PlayerUID::userIDStr() const
116{
117 char finalString[16];
118 wchar_t finalStringW[16];
119 sprintf(finalString, "%08d", m_userID);
120 mbstowcs(finalStringW, finalString, 64);
121 std::wstring retVal = finalStringW;
122 return retVal;
123}
124
125std::wstring PlayerUID::toString() const
126{
127 char macAddr[16];
128 char finalString[64];
129 wchar_t finalStringW[64];
130
131 const uint8_t* m = m_macAddress;
132 sprintf(macAddr, "%02x%02x%02x%02x%02x%02x", m[0],m[1],m[2],m[3],m[4],m[5]);
133 sprintf(finalString, "%s_%s_%08d_%s", isPrimaryUser() ? "P" : "N",
134 macAddr, m_userID,
135 isSignedIntoPSN() ? m_onlineID : "");
136 mbstowcs(finalStringW, finalString, 64);
137 return std::wstring(finalStringW);
138}
139
140void PlayerUID::setOnlineID(SceNpOnlineId& id, bool bSignedIntoPSN)
141{
142 memcpy(m_onlineID, id.data, SCE_NP_ONLINEID_MAX_LENGTH);
143 term = id.term;
144 m_bSignedIntoPSN = bSignedIntoPSN;
145}
146
147void PlayerUID::setUserID(unsigned int id) { m_userID = id; }
148
149bool PlayerUID::isPrimaryUser() const /* only true if we're on the local machine and signed into the first quadrant */
150{
151 if(m_quadrant != 0)
152 return false;
153
154 // get the mac address of this machine
155 SceNetEtherAddr etherAddr;
156 int err = sceNetGetMacAddress(ðerAddr, 0);
157 assert(err == 0);
158 bool macIsLocal = true;
159 for(int i=0;i<SCE_NET_ETHER_ADDR_LEN; i++)
160 {
161 if(m_macAddress[i] != etherAddr.data[i])
162 macIsLocal = false;
163 }
164 return macIsLocal; // only true if we're on the local machine and signed into the first quadrant
165}
166
167void PlayerUID::setForAdhoc()
168{
169 m_bSignedIntoPSN = false;
170 m_quadrant = 0;
171 memcpy(m_onlineID, ProfileManager.GetGamertag(0), SCE_NP_ONLINEID_MAX_LENGTH);
172 setCurrentMacAddress();
173}
174
175
176GameSessionUID::GameSessionUID()
177{
178 memset(this,0,sizeof(GameSessionUID));
179}
180
181GameSessionUID::GameSessionUID(int nullVal)
182{
183 assert(nullVal == 0);
184 memset(this,0,sizeof(GameSessionUID));
185}
186
187bool GameSessionUID::operator==(const GameSessionUID& rhs) const
188{
189 // comparing online IDs
190 if( getQuadrant() != rhs.getQuadrant() )
191 {
192 return false;
193 }
194 return (strcmp(m_onlineID, rhs.m_onlineID) == 0);
195}
196
197bool GameSessionUID::operator!=(const GameSessionUID& rhs)
198{
199 return !(*this==rhs);
200}
201
202
203GameSessionUID& GameSessionUID::operator=(const PlayerUID& rhs)
204{
205 memcpy(m_onlineID, rhs.getOnlineID(), SCE_NP_ONLINEID_MAX_LENGTH);
206 term = 0;
207 m_quadrant = rhs.getQuadrant();
208 m_bSignedIntoPSN = rhs.isSignedIntoPSN();
209 return *this;
210}
211
212void GameSessionUID::setForAdhoc()
213{
214 m_bSignedIntoPSN = false;
215 m_quadrant = 0;
216 memcpy(m_onlineID, ProfileManager.GetGamertag(0), SCE_NP_ONLINEID_MAX_LENGTH);
217}