⚠️ Get Chatballoons better (not 100% yet)

This commit is contained in:
duckietm 2025-05-07 17:38:34 +02:00
parent fd40554905
commit 22f3aa4596
2 changed files with 89 additions and 47 deletions

View File

@ -38,42 +38,78 @@ const useChatWidgetState = () =>
} }
}, [ chatSettings ]); }, [ chatSettings ]);
const setFigureImage = (figure: string) => const setFigureImage = (figure: string, username: string): Promise<string | null> => {
{ return new Promise((resolve) => {
const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, null, { console.log('setFigureImage called with figure:', figure, 'username:', username);
resetFigure: figure =>
{
if(isDisposed.current) return;
setFigureImage(figure); const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, null, {
}, resetFigure: figure => {
dispose: () => if (isDisposed.current) return;
{}, setFigureImage(figure, username);
disposed: false },
dispose: () => {},
disposed: false
});
console.log('avatarImage result:', avatarImage);
if (!avatarImage) {
console.log('Failed to create avatarImage for figure:', figure);
resolve('https://via.placeholder.com/40');
return;
}
avatarImage.getCroppedImage(AvatarSetType.HEAD).then(image => {
console.log('Cropped image:', image, 'Image src:', image?.src);
if (!image || !image.src) {
console.log('Failed to get cropped image or src for figure:', figure);
avatarImage.dispose();
resolve('https://via.placeholder.com/40');
return;
}
const color = avatarImage.getPartColor(AvatarFigurePartType.CHEST);
console.log('Avatar color:', color, 'RGB:', color?.rgb);
avatarColorCache.set(figure, ((color && color.rgb) || 16777215));
avatarImageCache.set(figure, image.src);
console.log('Cached image src:', image.src);
// Update existing chat messages for this username
setChatMessages(prevValue => {
const updatedMessages = prevValue.map(chat => {
if (chat.username === username && chat.imageUrl !== image.src) {
chat.imageUrl = image.src; // Update in-place
return { ...chat }; // Shallow copy to trigger re-render
}
return chat;
});
return updatedMessages;
});
avatarImage.dispose();
resolve(image.src);
}).catch(error => {
console.error('Error in setFigureImage:', error);
avatarImage.dispose();
resolve('https://via.placeholder.com/40');
});
}); });
};
if(!avatarImage) return; const getUserImage = (figure: string, username: string): string | null => {
const image = avatarImage.getCroppedImage(AvatarSetType.HEAD);
const color = avatarImage.getPartColor(AvatarFigurePartType.CHEST);
avatarColorCache.set(figure, ((color && color.rgb) || 16777215));
avatarImage.dispose();
avatarImageCache.set(figure, image.src);
return image.src;
}
const getUserImage = (figure: string) =>
{
let existing = avatarImageCache.get(figure); let existing = avatarImageCache.get(figure);
if(!existing) existing = setFigureImage(figure); if (!existing) {
setFigureImage(figure, username).then(src => {
avatarImageCache.set(figure, src);
});
return 'https://via.placeholder.com/40';
}
return existing; return existing;
} };
const getPetImage = (figure: string, direction: number, _arg_3: boolean, scale: number = 64, posture: string = null) => const getPetImage = (figure: string, direction: number, _arg_3: boolean, scale: number = 64, posture: string = null) =>
{ {
@ -88,49 +124,57 @@ const useChatWidgetState = () =>
if(image) if(image)
{ {
existing = TextureUtils.generateImageUrl(image.data); existing = TextureUtils.generateImageUrl(image.data);
petImageCache.set((figure + posture), existing); petImageCache.set((figure + posture), existing);
} }
return existing; return existing;
} };
useRoomSessionManagerEvent<RoomSessionChatEvent>(RoomSessionChatEvent.CHAT_EVENT, event => useRoomSessionManagerEvent<RoomSessionChatEvent>(RoomSessionChatEvent.CHAT_EVENT, event =>
{ {
const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, RoomObjectCategory.UNIT); const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, RoomObjectCategory.UNIT);
const bubbleLocation = roomObject ? GetRoomObjectScreenLocation(roomSession.roomId, roomObject?.id, RoomObjectCategory.UNIT) : new NitroPoint(); const bubbleLocation = roomObject ? GetRoomObjectScreenLocation(roomSession.roomId, roomObject?.id, RoomObjectCategory.UNIT) : new NitroPoint();
const userData = roomObject ? roomSession.userDataManager.getUserDataByIndex(event.objectId) : new RoomUserData(-1); const userData = roomObject ? roomSession.userDataManager.getUserDataByIndex(event.objectId) : new RoomUserData(-1);
let username = ''; let username = '';
let avatarColor = 0; let avatarColor = 0;
let imageUrl: string = null; let imageUrl: string | null = null;
let chatType = event.chatType; let chatType = event.chatType;
let styleId = event.style; let styleId = event.style;
let userType = 0; let userType = 0;
let petType = -1; let petType = -1;
let text = event.message; let text = event.message;
let chatColours = event._chatColours let chatColours = event._chatColours;
if(userData) if(userData)
{ {
userType = userData.type; userType = userData.type;
const figure = userData.figure; const figure = userData.figure;
console.log('Chat Event Debug:', {
userId: event.objectId,
username: userData.name,
userType,
figure,
roomObjectExists: !!roomObject
});
switch(userType) switch(userType)
{ {
case RoomObjectType.PET: case RoomObjectType.PET:
imageUrl = getPetImage(figure, 2, true, 64, roomObject.model.getValue<string>(RoomObjectVariable.FIGURE_POSTURE)); imageUrl = getPetImage(figure, 2, true, 64, roomObject.model.getValue<string>(RoomObjectVariable.FIGURE_POSTURE));
petType = new PetFigureData(figure).typeId; petType = new PetFigureData(figure).typeId;
chatColours = "black" chatColours = "black";
break; break;
case RoomObjectType.USER: case RoomObjectType.USER:
imageUrl = getUserImage(figure); imageUrl = getUserImage(figure, userData.name);
console.log('getUserImage result:', { figure, imageUrl });
break; break;
case RoomObjectType.RENTABLE_BOT: case RoomObjectType.RENTABLE_BOT:
case RoomObjectType.BOT: case RoomObjectType.BOT:
styleId = SystemChatStyleEnum.BOT; styleId = SystemChatStyleEnum.BOT;
chatColours = "black" chatColours = "black";
break; break;
} }
@ -209,7 +253,8 @@ const useChatWidgetState = () =>
styleId, styleId,
imageUrl, imageUrl,
color, color,
chatColours); chatColours
);
setChatMessages(prevValue => [ ...prevValue, chatMessage ]); setChatMessages(prevValue => [ ...prevValue, chatMessage ]);
addChatEntry({ id: -1, webId: userData.webID, entityId: userData.roomIndex, name: username, imageUrl, style: styleId, chatType: chatType, entityType: userData.type, message: formattedText, timestamp: ChatHistoryCurrentDate(), type: ChatEntryType.TYPE_CHAT, roomId: roomSession.roomId, color, chatColours }); addChatEntry({ id: -1, webId: userData.webID, entityId: userData.roomIndex, name: username, imageUrl, style: styleId, chatType: chatType, entityType: userData.type, message: formattedText, timestamp: ChatHistoryCurrentDate(), type: ChatEntryType.TYPE_CHAT, roomId: roomSession.roomId, color, chatColours });
@ -251,6 +296,6 @@ const useChatWidgetState = () =>
}, []); }, []);
return { chatMessages, setChatMessages, chatSettings, getScrollSpeed }; return { chatMessages, setChatMessages, chatSettings, getScrollSpeed };
} };
export const useChatWidget = useChatWidgetState; export const useChatWidget = useChatWidgetState;

View File

@ -14,7 +14,6 @@ export class TextureUtils
{ {
if (!this._extract && renderer) { if (!this._extract && renderer) {
this._extract = new Extract(renderer); this._extract = new Extract(renderer);
console.log('TextureUtils: Initialized Extract plugin', { renderer });
} }
} }
@ -38,13 +37,11 @@ export class TextureUtils
} }
const image = await extractor.image(target); const image = await extractor.image(target);
console.log('generateImage: Extracted image', { src: image?.src, isValid: image?.src?.startsWith('data:image/') });
if (!image || !image.src || !image.src.startsWith('data:image/')) { if (!image || !image.src || !image.src.startsWith('data:image/')) {
const canvas = extractor.canvas(target); const canvas = extractor.canvas(target);
if (canvas) { if (canvas) {
const dataUrl = canvas.toDataURL('image/png'); const dataUrl = canvas.toDataURL('image/png');
console.log('generateImage: Fallback canvas', { dataUrl });
if (dataUrl && dataUrl.startsWith('data:image/')) { if (dataUrl && dataUrl.startsWith('data:image/')) {
const fallbackImage = new Image(); const fallbackImage = new Image();
fallbackImage.src = dataUrl; fallbackImage.src = dataUrl;