From e6e745fec6dbafb2de4f4c3da6850e05830c6893 Mon Sep 17 00:00:00 2001 From: zeph Date: Fri, 12 Dec 2025 01:35:17 +0100 Subject: [PATCH] Clans: polishing - Removed usage of raw pointers with `new` - `clans_client::getClanTicket` now _actually_ uses the cached ticket if available. - Avoid setting `current_ticket` and instead hijack it if it's the Clans ticket - Refusing to get a ticket if emulator is not connected to RPCN Signed-off-by: zeph --- rpcs3/Emu/Cell/Modules/sceNpClans.cpp | 4 +--- rpcs3/Emu/NP/clans_client.cpp | 21 +++++++++++++++++---- rpcs3/Emu/NP/np_requests.cpp | 16 +++++++++------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNpClans.cpp b/rpcs3/Emu/Cell/Modules/sceNpClans.cpp index 03fb1f9b38..03c6ce4da3 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpClans.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpClans.cpp @@ -475,13 +475,12 @@ error_code sceNpClansGetMemberList(SceNpClansRequestHandle handle, SceNpClanId c std::memcpy(&host_paging, paging.get_ptr(), sizeof(SceNpClansPagingRequest)); } - SceNpClansMemberEntry* host_memList_addr = new SceNpClansMemberEntry[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX]; + SceNpClansMemberEntry host_memList_addr[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; SceNpClansPagingResult host_pageResult = {}; SceNpClansError ret = clans_manager.client->getMemberList(nph, handle, clanId, &host_paging, status, host_memList_addr, &host_pageResult); if (ret != SCE_NP_CLANS_SUCCESS) { - delete[] host_memList_addr; return ret; } @@ -491,7 +490,6 @@ error_code sceNpClansGetMemberList(SceNpClansRequestHandle handle, SceNpClanId c } std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult)); - delete[] host_memList_addr; return CELL_OK; } diff --git a/rpcs3/Emu/NP/clans_client.cpp b/rpcs3/Emu/NP/clans_client.cpp index 022b9fa3d6..2efcebbb7e 100644 --- a/rpcs3/Emu/NP/clans_client.cpp +++ b/rpcs3/Emu/NP/clans_client.cpp @@ -1,3 +1,4 @@ +#include "Emu/Cell/Modules/sceNp.h" #include "stdafx.h" #include @@ -286,6 +287,11 @@ namespace clan std::string clans_client::getClanTicket(np::np_handler& nph) { + // Pretend we failed to get a ticket if the emulator isn't + // connected to RPCN. + if (nph.get_psn_status() != SCE_NP_MANAGER_STATUS_ONLINE) + return ""; + const auto& npid = nph.get_npid(); const char* service_id = CLANS_SERVICE_ID; @@ -294,13 +300,20 @@ namespace clan const char* entitlement_id = CLANS_ENTITLEMENT_ID; const u32 consumed_count = 0; - nph.req_ticket(0x00020001, &npid, service_id, cookie, cookie_size, entitlement_id, consumed_count); - + // Use the cached ticket if available np::ticket ticket = nph.get_clan_ticket(); if (ticket.empty()) { - clan_log.error("Failed to get clan ticket"); - return ""; + // If not cached, request a new ticket + nph.req_ticket(0x00020001, &npid, service_id, cookie, cookie_size, entitlement_id, consumed_count); + ticket = nph.get_clan_ticket(); + + // If still empty, return error + if (ticket.empty()) + { + clan_log.error("Failed to get clan ticket"); + return ""; + } } std::vector ticket_bytes(1024); diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index ce66c23b30..d05baa6754 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -864,20 +864,22 @@ namespace np auto ticket_raw = reply.get_rawdata(); ensure(!reply.is_error(), "Malformed reply to RequestTicket command"); - current_ticket = ticket(std::move(ticket_raw)); - auto ticket_size = static_cast(current_ticket.size()); - - - // Clans: check if ticket belongs to the clan service. If so, store it. - if (current_ticket.get_service_id() == CLANS_SERVICE_ID) + auto incoming_ticket = ticket(std::move(ticket_raw)); + + // Clans: check if ticket belongs to the clan service. + // If so, hijack the ticket and cache it for future use. + if (incoming_ticket.get_service_id() == CLANS_SERVICE_ID) { - clan_ticket = current_ticket; + clan_ticket = incoming_ticket; clan_ticket_ready.store(true); clan_ticket_ready.notify_all(); return; } + current_ticket = incoming_ticket; + auto ticket_size = static_cast(current_ticket.size()); + if (manager_cb) { sysutil_register_cb([manager_cb = this->manager_cb, ticket_size, manager_cb_arg = this->manager_cb_arg](ppu_thread& cb_ppu) -> s32