diff --git a/html/src/app.js b/html/src/app.js
index 0fcd6869..52362421 100644
--- a/html/src/app.js
+++ b/html/src/app.js
@@ -110,7 +110,7 @@ speechSynthesis.getVoices();
this.Set(key, JSON.stringify(value));
};
- setInterval(function () {
+ workerTimers.setInterval(function () {
VRCXStorage.Flush();
}, 5 * 60 * 1000);
@@ -3966,7 +3966,7 @@ speechSynthesis.getVoices();
}
});
- setInterval(function () {
+ workerTimers.setInterval(function () {
for (var $timer of $timers) {
$timer.update();
}
@@ -4024,7 +4024,7 @@ speechSynthesis.getVoices();
}
});
- setInterval(function () {
+ workerTimers.setInterval(function () {
for (var $countDownTimer of $countDownTimers) {
$countDownTimer.update();
}
@@ -7606,7 +7606,6 @@ speechSynthesis.getVoices();
this.moderationEventQueue = new Map();
this.lastPortalId = '';
this.lastPortalList = new Map();
- this.portalQueue = '';
if (this.photonEventTable.data.length > 0) {
this.photonEventTablePrevious.data = this.photonEventTable.data;
this.photonEventTable.data = [];
@@ -7988,20 +7987,7 @@ speechSynthesis.getVoices();
database.addGamelogJoinLeaveToDatabase(entry);
break;
case 'portal-spawn':
- if (this.portalQueue === 'skip') {
- this.portalQueue = '';
- return;
- } else if (this.portalQueue && gameLog.userDisplayName) {
- var ref = {
- id: userId,
- displayName: gameLog.userDisplayName
- };
- this.parsePhotonPortalSpawn(
- gameLog.dt,
- this.portalQueue,
- ref
- );
- this.portalQueue = '';
+ if (this.ipcEnabled && this.isGameRunning) {
return;
}
var entry = {
@@ -8101,7 +8087,6 @@ speechSynthesis.getVoices();
'https://gist.github.com/Natsumi-sama/d280a58f08ace3da0e8fc7a9a381d44e';
$app.data.lastPortalId = '';
$app.data.lastPortalList = new Map();
- $app.data.portalQueue = '';
$app.data.moderationEventQueue = new Map();
$app.data.moderationAgainstTable = [];
$app.data.photonLobby = new Map();
@@ -8750,14 +8735,11 @@ speechSynthesis.getVoices();
id: this.getUserIdFromPhotonId(senderId),
displayName
};
- this.portalQueue = 'skip';
this.parsePhotonPortalSpawn(
gameLogDate,
instanceId,
ref1
);
- } else {
- this.portalQueue = instanceId;
}
return;
} else if (eventData.Type > 34) {
@@ -8794,11 +8776,9 @@ speechSynthesis.getVoices();
} else {
var eventVrc = '';
if (eventData.Data) {
- if (Array.isArray(eventData.Data)) {
- eventVrc = ` ${eventData.Data.toString()}`;
- } else {
- eventVrc = ` ${eventData.Data}`;
- }
+ eventVrc = ` ${JSON.stringify(
+ eventData.Data
+ ).replace(/"([^(")"]+)":/g, '$1:')}`;
}
var text = `${eventData.EventType}${eventVrc}`;
}
@@ -9128,9 +9108,14 @@ speechSynthesis.getVoices();
oldAvatarId !== avatar.id &&
user.id !== API.currentUser.id
) {
- var entry = {
- created_at: new Date().toJSON(),
- type: 'AvatarChange',
+ this.checkVRChatCache(avatar).then((cacheInfo) => {
+ var inCache = false;
+ if (cacheInfo[0] > 0) {
+ inCache = true;
+ }
+ var entry = {
+ created_at: new Date().toJSON(),
+ type: 'AvatarChange',
userId: user.id,
displayName: user.displayName,
name: avatar.name,
@@ -9146,10 +9131,12 @@ speechSynthesis.getVoices();
this.addEntryPhotonEvent({
photonId,
displayName: user.displayName,
- userId: user.id,
- text: `ChangeAvatar ${avatar.name}`,
- created_at: gameLogDate,
- avatar
+ userId: user.id,
+ text: `ChangeAvatar ${avatar.name}`,
+ created_at: gameLogDate,
+ avatar,
+ inCache
+ });
});
}
this.photonLobbyAvatars.set(user.id, avatar.id);
@@ -9184,7 +9171,7 @@ speechSynthesis.getVoices();
var videoName = '';
var videoLength = '';
var displayName = '';
- var videoPos = 10; // video loading delay
+ var videoPos = 8; // video loading delay
if (typeof gameLog.displayName !== 'undefined') {
displayName = gameLog.displayName;
}
@@ -17305,6 +17292,69 @@ speechSynthesis.getVoices();
this.downloadVRChatCacheProgress();
};
+ $app.methods.downloadVRChatCacheOldVersion = async function (
+ worldId,
+ oldAssetUrl
+ ) {
+ var args = await API.getWorld({worldId});
+ var ref = args.json;
+ var latestAssetUrl = '';
+ for (var i = ref.unityPackages.length - 1; i > -1; i--) {
+ var unityPackage = ref.unityPackages[i];
+ if (
+ unityPackage.platform === 'standalonewindows' &&
+ this.compareUnityVersion(unityPackage.unityVersion) &&
+ !latestAssetUrl
+ ) {
+ latestAssetUrl = unityPackage.assetUrl;
+ break;
+ }
+ }
+ if (latestAssetUrl === oldAssetUrl) {
+ console.log('File version is latest');
+ return;
+ }
+ var fileId = extractFileId(latestAssetUrl);
+ var fileVersion = parseInt(extractFileVersion(latestAssetUrl), 10);
+ var oldFileId = extractFileId(oldAssetUrl);
+ var oldFileVersion = parseInt(extractFileVersion(oldAssetUrl), 10);
+ if (!fileId) {
+ console.log('latestFileId invalid asset url');
+ return;
+ }
+ if (!oldFileId) {
+ console.log('oldFileId invalid asset url');
+ return;
+ }
+ var args = await API.getBundles(oldFileId);
+ var {versions} = args.json;
+ var file = '';
+ for (var i = versions.length - 1; i > -1; i--) {
+ var version = versions[i];
+ if (version.version === oldFileVersion) {
+ file = version.file;
+ break;
+ }
+ }
+ if (!file) {
+ console.log('Missing asset version');
+ return;
+ }
+ var {url, md5, sizeInBytes} = file;
+ var cacheDir = await this.getVRChatCacheDir();
+ await AssetBundleCacher.DeleteCache(cacheDir, fileId, fileVersion);
+ await AssetBundleCacher.DownloadCacheFile(
+ cacheDir,
+ url,
+ fileId,
+ fileVersion,
+ sizeInBytes,
+ md5,
+ appVersion,
+ false
+ );
+ };
+
$app.methods.cancelVRChatCacheDownload = function (location) {
var L = API.parseLocation(location);
if (L.worldId) {
@@ -17465,7 +17515,8 @@ speechSynthesis.getVoices();
if (
this.isGameRunning &&
(this.downloadCurrent.type === 'Invite' ||
- this.downloadCurrent.type === 'Portal')
+ this.downloadCurrent.type === 'Portal' ||
+ this.downloadCurrent.type === 'Manual')
) {
var entry = {
created_at: new Date().toJSON(),
diff --git a/html/src/index.pug b/html/src/index.pug
index ba8451dd..ba3c2403 100644
--- a/html/src/index.pug
+++ b/html/src/index.pug
@@ -1551,7 +1551,7 @@ html
.x-friend-list(style="margin-top:10px;min-height:60px")
.x-friend-item(v-for="avatar in userDialogAvatars" @click="showAvatarDialog(avatar.id)" class="x-friend-item-border")
.avatar
- img(v-lazy="avatar.thumbnailImageUrl")
+ img(v-if="avatar.thumbnailImageUrl" v-lazy="avatar.thumbnailImageUrl")
.detail
span.name(v-text="avatar.name")
span.extra(v-text="avatar.releaseStatus" v-if="avatar.releaseStatus === 'public'" style="color: #67c23a;")
@@ -2747,7 +2747,7 @@ html
span(v-text="scope.row.timer")
el-table-column(label="Action" width="60" align="right")
template(v-once #default="scope")
- el-button(type="text" icon="el-icon-message" size="mini" @click="showLaunchDialog(scope.row.location)")
+ el-button(type="text" icon="el-icon-info" size="mini" @click="showLaunchDialog(scope.row.location)")
el-button(type="text" icon="el-icon-close" size="mini" @click="confirmDeleteGameLogUserInstance(scope.row)")
//- dialog Table: Previous Instances World
diff --git a/html/src/vr.js b/html/src/vr.js
index 3ce59c11..3ae6b158 100644
--- a/html/src/vr.js
+++ b/html/src/vr.js
@@ -564,7 +564,7 @@ Vue.component('marquee-text', MarqueeText);
};
$app.methods.addEntryHudFeed = function (json) {
- var {displayName, text, color} = JSON.parse(json);
+ var {displayName, text, color, avatar, inCache} = JSON.parse(json);
var combo = 1;
this.hudFeed.forEach((item) => {
if (item.displayName === displayName && item.text === text) {
@@ -577,7 +577,9 @@ Vue.component('marquee-text', MarqueeText);
displayName,
text,
combo,
- color
+ color,
+ avatar,
+ inCache
});
this.cleanHudFeed();
};
diff --git a/html/src/vr.pug b/html/src/vr.pug
index 3c950511..f94b3732 100644
--- a/html/src/vr.pug
+++ b/html/src/vr.pug
@@ -132,7 +132,12 @@ html
.detail
span.extra
span.time {{ feed.created_at | formatDate }}
- | 🧍 #[span.name(v-text="feed.displayName")] {{ feed.name }}
+ | 🧍 #[span.name(v-text="feed.displayName")]
+ template(v-if="feed.releaseStatus === 'public'")
+ | #[i.x-user-status.online]
+ template(v-else)
+ | #[i.x-user-status.askme]
+ | {{ feed.name }}
template(v-if="feed.description && feed.description !== feed.name")
| - {{ feed.description }}
div(v-else-if="feed.type === 'Event'" class="x-friend-item")
@@ -295,7 +300,12 @@ html
.detail
span.extra
span.time {{ feed.created_at | formatDate }}
- | #[span.name(v-text="feed.displayName")] changed into avatar {{ feed.name }}
+ | #[span.name(v-text="feed.displayName")] changed into avatar
+ template(v-if="feed.releaseStatus === 'public'")
+ | #[i.x-user-status.online]
+ template(v-else)
+ | #[i.x-user-status.askme]
+ | {{ feed.name }}
template(v-if="feed.description && feed.description !== feed.name")
| - {{ feed.description }}
div(v-else-if="feed.type === 'Event'" class="x-friend-item")
@@ -418,10 +428,14 @@ html
.hud-feed
div(v-for="feed in hudFeed")
.item #[span(v-if="feed.isMaster") 👑]{{ feed.displayName }}
- span(v-if="feed.color === 'yellow'" style="color: yellow") {{ feed.text }}
- span(v-else) {{ feed.text }}
+ span(v-if="feed.avatar")
+ span(style="margin-left:10px") ChangeAvatar
+ span(v-if="!feed.inCache" style="color:#aaa;margin-left:10px") #[i.el-icon-download]
+ span(v-text="feed.avatar.name" style="margin-left:10px")
+ span(v-else-if="feed.color === 'yellow'" style="color:yellow;margin-left:10px") {{ feed.text }}
+ span(v-else style="margin-left:10px") {{ feed.text }}
template(v-if="feed.combo > 1")
- span.combo x{{ feed.combo }}
+ span.combo(style="margin-left:10px") x{{ feed.combo }}
.hud-timeout(v-if="hudTimeout.length > 0")
.hud-timeout-feed
div(v-for="feed in hudTimeout")