Add new actions and expressions for multiplayer (#6717)

* Send a variable with a custom message
* Retrieve the player number of the sender
This commit is contained in:
Clément Pasteau
2024-06-25 17:07:38 +02:00
committed by GitHub
parent f82b5fc66d
commit f58e1113b6
2 changed files with 156 additions and 11 deletions

View File

@@ -144,7 +144,71 @@ module.exports = {
.addIncludeFile('Extensions/Multiplayer/messageManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayerVariablesManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayertools.js')
.setFunctionName('gdjs.multiplayerMessageManager.sendMessage');
.setFunctionName('gdjs.multiplayerMessageManager.sendCustomMessage');
extension
.addAction(
'SendVariableMessage',
_('Send custom message to other players with a variable'),
_(
"Send a custom message to other players in the lobby containing a variable, with an automatic retry system if it hasn't been received. Use with the condition 'Message has been received' to know when the message has been properly processed by the host."
),
_('Send message _PARAM0_ to other players with variable _PARAM1_'),
_('Advanced'),
'JsPlatform/Extensions/multiplayer.svg',
'JsPlatform/Extensions/multiplayer.svg'
)
.setHelpPath('/all-features/multiplayer')
.addParameter('string', _('Message name'), '', false)
.addParameter('variable', _('Variable'), '', false)
.getCodeExtraInformation()
.setIncludeFile('Extensions/P2P/A_peer.js')
.addIncludeFile('Extensions/P2P/B_p2ptools.js')
.addIncludeFile(
'Extensions/PlayerAuthentication/playerauthenticationcomponents.js'
)
.addIncludeFile(
'Extensions/PlayerAuthentication/playerauthenticationtools.js'
)
.addIncludeFile('Extensions/Multiplayer/multiplayercomponents.js')
.addIncludeFile('Extensions/Multiplayer/messageManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayerVariablesManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayertools.js')
.setFunctionName(
'gdjs.multiplayerMessageManager.sendVariableCustomMessage'
);
extension
.addAction(
'GetMessageVariable',
_('Get message variable'),
_(
"Store the data of the specified message in a variable. Use with the condition 'Message has been received' to know when the message has been properly processed by the host."
),
_('Save message _PARAM0_ data in _PARAM1_'),
_('Advanced'),
'JsPlatform/Extensions/multiplayer.svg',
'JsPlatform/Extensions/multiplayer.svg'
)
.setHelpPath('/all-features/multiplayer')
.addParameter('string', _('Message name'), '', false)
.addParameter('variable', _('Variable'), '', false)
.getCodeExtraInformation()
.setIncludeFile('Extensions/P2P/A_peer.js')
.addIncludeFile('Extensions/P2P/B_p2ptools.js')
.addIncludeFile(
'Extensions/PlayerAuthentication/playerauthenticationcomponents.js'
)
.addIncludeFile(
'Extensions/PlayerAuthentication/playerauthenticationtools.js'
)
.addIncludeFile('Extensions/Multiplayer/multiplayercomponents.js')
.addIncludeFile('Extensions/Multiplayer/messageManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayerVariablesManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayertools.js')
.setFunctionName(
'gdjs.multiplayerMessageManager.getVariableCustomMessageData'
);
extension
.addCondition(
@@ -273,7 +337,9 @@ module.exports = {
.addIncludeFile('Extensions/Multiplayer/messageManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayerVariablesManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayertools.js')
.setFunctionName('gdjs.multiplayerMessageManager.hasMessageBeenReceived');
.setFunctionName(
'gdjs.multiplayerMessageManager.hasCustomMessageBeenReceived'
);
extension
.addCondition(
@@ -375,7 +441,31 @@ module.exports = {
.addIncludeFile('Extensions/Multiplayer/messageManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayerVariablesManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayertools.js')
.setFunctionName('gdjs.multiplayerMessageManager.getMessageData');
.setFunctionName('gdjs.multiplayerMessageManager.getCustomMessageData');
extension
.addStrExpression(
'MessageSender',
_('Message sender'),
_('Returns the player number of the sender of the specified message.'),
_('Advanced'),
'JsPlatform/Extensions/multiplayer.svg'
)
.addParameter('string', _('Message name'), '', false)
.getCodeExtraInformation()
.setIncludeFile('Extensions/P2P/A_peer.js')
.addIncludeFile('Extensions/P2P/B_p2ptools.js')
.addIncludeFile(
'Extensions/PlayerAuthentication/playerauthenticationcomponents.js'
)
.addIncludeFile(
'Extensions/PlayerAuthentication/playerauthenticationtools.js'
)
.addIncludeFile('Extensions/Multiplayer/multiplayercomponents.js')
.addIncludeFile('Extensions/Multiplayer/messageManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayerVariablesManager.js')
.addIncludeFile('Extensions/Multiplayer/multiplayertools.js')
.setFunctionName('gdjs.multiplayerMessageManager.getCustomMessageSender');
extension
.addExpressionAndCondition(

View File

@@ -1353,7 +1353,10 @@ namespace gdjs {
);
};
const sendMessage = (userMessageName: string, userMessageData: string) => {
const sendCustomMessage = (
userMessageName: string,
userMessageData: any // can be a simple string message or a serialized variable.
) => {
const connectedPeerIds = gdjs.evtTools.p2p.getAllPeers();
const { messageName, messageData } = createCustomMessage({
userMessageName,
@@ -1370,6 +1373,11 @@ namespace gdjs {
// custom messages cannot be reverted.
shouldCancelMessageIfTimesOut: false,
});
debugLogger.info(
`Sending custom message ${userMessageName} with data ${JSON.stringify(
userMessageData
)}.`
);
for (const peerId of connectedPeerIds) {
sendDataTo(peerId, messageName, messageData);
}
@@ -1389,7 +1397,20 @@ namespace gdjs {
}
};
const hasMessageBeenReceived = (userMessageName: string) => {
const sendVariableCustomMessage = (
userMessageName: string,
variable: gdjs.Variable
) => {
const userMessageData = variable.toJSObject();
debugLogger.info(
`Sending custom message ${userMessageName} with data ${JSON.stringify(
userMessageData
)}.`
);
sendCustomMessage(userMessageName, userMessageData);
};
const hasCustomMessageBeenReceived = (userMessageName: string) => {
const messageName = getCustomMessageNameFromUserMessageName(
userMessageName
);
@@ -1422,9 +1443,9 @@ namespace gdjs {
return false;
};
const getMessageData = (messageName: string) => {
const getCustomMessageData = (userMessageName: string) => {
const customMessageName = getCustomMessageNameFromUserMessageName(
messageName
userMessageName
);
const messageData = gdjs.evtTools.p2p.getEventData(customMessageName);
let data;
@@ -1432,7 +1453,7 @@ namespace gdjs {
data = JSON.parse(messageData);
} catch (e) {
logger.error(
`Error while parsing message ${messageName}: ${e.toString()}`
`Error while parsing message ${userMessageName}: ${e.toString()}`
);
return '';
}
@@ -1440,6 +1461,37 @@ namespace gdjs {
return data.data;
};
const getVariableCustomMessageData = (
userMessageName: string,
variable: gdjs.Variable
) => {
const data = getCustomMessageData(userMessageName);
if (!data) {
return;
}
debugLogger.info(
`Received custom message ${userMessageName} with data ${JSON.stringify(
data
)}.`
);
variable.fromJSObject(data);
};
const getCustomMessageSender = (userMessageName: string) => {
const customMessageName = getCustomMessageNameFromUserMessageName(
userMessageName
);
const messageSenderPeerId = gdjs.evtTools.p2p.getEventSender(
customMessageName
);
const messageSenderPlayerNumber =
_peerIdToPlayerNumber[messageSenderPeerId];
if (messageSenderPlayerNumber === undefined) {
return 0;
}
return messageSenderPlayerNumber;
};
const handleCustomMessagesReceived = (): void => {
const p2pMessagesMap = gdjs.evtTools.p2p.getEvents();
const messageNamesArray = Array.from(p2pMessagesMap.keys());
@@ -2123,10 +2175,13 @@ namespace gdjs {
createVariableOwnerChangedMessageNameFromChangeVariableOwnerMessage,
handleChangeVariableOwnerMessagesReceived,
// Custom messages.
sendMessage,
hasMessageBeenReceived,
getMessageData,
sendCustomMessage,
getCustomMessageData,
sendVariableCustomMessage,
getVariableCustomMessageData,
hasCustomMessageBeenReceived,
handleCustomMessagesReceived,
getCustomMessageSender,
// Scene update.
createUpdateSceneMessage,
handleUpdateSceneMessagesToSend,