Direct Messaging scripts for Self-Registering Game Object --updated to include degault prefab name in case the game designer fails to register it DM Asset may be placed in multiple game assets so the DM Master( game controller ) can locate and communictate with serveral assets. This is a demo setup to show how assets can discover they are no longer registered to recieve work requests-- leading them to re-register.
var gameObjects = {};
var trackedAssetCount = getParam('Tracked Asset Count');
var running = false;
var retry;
function getGameObjects(globalStateData) {
//error('In getAssets: globalStateData = ' + stringify(globalStateData, { newline: false, indent: false }));
//error('In getAssets: TOTAL TRACKED ASSETS SETTING = ' + trackedAssetCount);
error('GetGameObjects: TOTAL ASSETS FOUND IS: ' +keys(gameObjects).length);
gameObjects = globalStateData.gameObjects;
if (globalStateData.polled) {
if (keys(gameObjects).length < trackedAssetCount) {
error('getGameObjects: All assets don\'t exist. Continuing to poll...');
pollEntity();
} else {
timerDestroy('pollEntity');
error('getGameObjects: All entities found. Everything seems good.');
}
}
}
function pollEntity() {
error('assets{} length = ' + keys(gameObjects).length);
//error('Polling Global State...');
getGlobalState({
state_key: 'DM Key',
keys: ['gameObjects'],
callback: 'getGameObjects',
callback_data: { polled: true }
});
}
function checkTaskResponse(messageData) {
//error('checkTaskResponse: messageData = ' + stringify(messageData, { newline: false, indent: false }));
if (messageData.err !== undefined) {
//error('checkTaskResponse: We have an error messageData = ' + stringify(messageData, { newline: false, indent: false }));
purgeAssetFromDB(messageData.name);
//error('checkTaskResponse: Starting timer for polled broadcast...');
timerCreate({ name: 'pollEntity', period: 4 });
} else {
timerDestroy('pollEntity');
error('checkTaskResponse: Entity was found. Everything seems good.');
}
}
function purgeAssetFromDB(assetName){
//error('In purgeAssetsFromDB: gameObjects = ' + stringify(gameObjects, { newline: false, indent: false }));
//error("In purgeAssetsFromDB: the property name to be deleted is: " + assetName);
delete gameObjects[assetName];
var gameObjectsCopy = clone(gameObjects);
setGlobalState({
state_key: 'DM Key',
data: {gameObjects:gameObjectsCopy}
});
setGlobalState({
state_key: 'DM Key',
data: {gameObjects:gameObjectsCopy}
});
error('Entity ( ' + assetName + ' ) not found. Purged old ID. Putting system into Standby mode.');
//error('After purging, assets now contains: ' + stringify(gameObjectsCopy, { newline: false, indent: false }));
}
// Registration..
function register(data) {
if ( retry !== true || data.err !== undefined ) {
getGlobalState({
state_key: 'DM Key',
keys: ['gameObjects'],
callback: 'registerYourself'
});
} else {
//error('Updated with ID: ' + getSelfEnt());//done
}
}
function registerYourself(data) {
//error('In RegisterYourself: global state has: ' + stringify(data,{ newline: false, indent: false }));
gameObjects = data.gameObjects;
var base_gameObjects = clone(gameObjects);
if (gameObjects === undefined) {
gameObjects = { };
}
var my_name = getParam('Game Object Name');
gameObjects[my_name] = getSelfEnt();
retry = true;
//error('In RegisterYourself: SETTING global state TO: ' + stringify(gameObjects,{ newline: false, indent: false }));
setGlobalState({
state_key: 'DM Key',
data: { gameObjects: gameObjects },
check: { gameObjects: base_gameObjects},
callback: 'register'
});
}
function pingAssets() {
//error('PING: Getting asset ID\'s from database...');
getGlobalState({
state_key: 'DM Key',
keys: ['gameObjects'],
callback: 'getGameObjects'
});
}
function triggerGameTask()
{
if (gameObjects !== "undefined") {
//error('IN TRIGGER GAME TASK: ' + stringify(gameObjects, { newline: false, indent: false }));
var assetNames = keys(gameObjects);
//error('IN TRIGGER GAME TASK the game object keys are: ' + stringify(assetNames, { newline: false, indent: false }));
//error('TOTAL ASSETS FOUND = ' + assetNames.length);
if ( assetNames !== "undefined" && assetNames.length !== 0 ) {
for ( var i = 0 ;i< assetNames.length;i++) {
//error('Processing Game Asset: ' + assetNames[i] );
//error('Direct Messaging '+ assetNames[i] + ' via ID [' + gameObjects[assetNames[i]] + '] to do a task...');
directMessage({
ent: gameObjects[assetNames[i]],
channel: 'dm_channel',
message: 'task',
callback: 'checkTaskResponse',
callback_data: { name: assetNames[i] }
});
}
}
}
}
function clickStart() {
error('TRIGGERING GAME TASK!');
triggerGameTask();
}
function init() {
retry = false;
register({});
handlerCreate({
name: 'clickStart',
channel: 'direct',
message: 'clickStart'
});
error('STARTED!');
// timerCreate({ name: 'pingAssets', period: 10 });
}
init();
// Register...
var g_myName = getParam('Game Object Name')===''?'prefab'+randomInt(0,70000):getParam('Game Object Name');
//http://wiki.cloudparty.com/wiki/Script_Examples/Scene_Scripts
// Where are we?
var retry;
function init(){
retry = false;
register({});
//in case we get purged due to com delays
timerCreate({name: 'keepAlive', period: 10});
}
function keepAlive() {
getGlobalState({
state_key: 'DM Key',
keys: ['gameObjects'],
callback: 'reRegister'
});
}
function reRegister(globalStateData) {
var keysArray = keys(globalStateData.gameObjects);
//if my name isn't on the list then re-register, controller purged me
if ( keysArray !== "undefined" && keysArray.length>0 ) {
if ( keysArray.indexOf(g_myName) == -1 ) {
error('CONTROLLER PURGED ME! RE-REGISTERING: ' + g_myName + ' as : ' + globalStateData.gameObjects[g_myName]);
retry = false;
register({});
}
}
}
// Registration..
function register(data) {
if ( retry !== true || data.err !== undefined ) {
getGlobalState({
state_key: 'DM Key',
keys: ['gameObjects'],
callback: 'registerYourself'
});
} else {
error('Updated with ID: ' + getSelfEnt());//done
}
}
function registerYourself(data) {
var gameObjects = data.gameObjects;
var base_gameObjects = clone(gameObjects);
if (gameObjects === undefined) {
gameObjects = { };
}
gameObjects[g_myName] = getSelfEnt();
retry = true;
setGlobalState({
state_key: 'DM Key',
data: { gameObjects: gameObjects },
check: { gameObjects: base_gameObjects},
callback: 'register'
});
}
init();