the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 217 lines 5.2 kB view raw
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(&etherAddr, 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(&etherAddr, 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}