mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
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:
@@ -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(
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user