2014-01-12 12:26:26 +01:00
|
|
|
/*************************************************************************
|
|
|
|
## Cow Clicker Mini-Game
|
|
|
|
|
|
|
|
### How to Play
|
|
|
|
|
|
|
|
At the in-game prompt type `jsp cowclicker` to start or stop
|
|
|
|
playing. Right-Click on Cows to score points. No points for killing
|
|
|
|
cows (hint: use the same keyboard keys you'd use for opening doors).
|
|
|
|
|
|
|
|
Every time you click a cow your score increases by 1 point. Your score
|
|
|
|
is displayed in a side-bar along the right edge of of the screen.
|
|
|
|
|
|
|
|
![cow clicker](img/cowclicker.png)
|
|
|
|
|
|
|
|
### Rules
|
|
|
|
|
|
|
|
* You can join and leave the Cow Clicker game at any time by typing
|
|
|
|
`/jsp cowclicker` at the in-game prompt.
|
|
|
|
|
|
|
|
* Once you leave the game, your score is reset to zero.
|
|
|
|
|
2014-01-12 13:06:30 +01:00
|
|
|
* When you disconnect from the server, your score will be reset to zero.
|
2014-01-12 12:26:26 +01:00
|
|
|
|
|
|
|
### Gameplay Mechanics
|
|
|
|
|
|
|
|
This is meant as a trivially simple use of the [Bukkit Scoreboard
|
|
|
|
API][bukscore]. There are many things you'll want to consider when constructing
|
|
|
|
your own mini-game...
|
|
|
|
|
|
|
|
* Is the game itself a long-lived game - that is - should players and
|
|
|
|
scores be persisted (stored) between server restarts?
|
|
|
|
|
|
|
|
* What should happen when a player quits the server - should this also be
|
|
|
|
understood as quitting the mini-game?
|
|
|
|
|
|
|
|
* What should happen when a player who was previously playing the
|
|
|
|
mini-game, joins the server - should they automatically resume the
|
|
|
|
mini-game?
|
|
|
|
|
|
|
|
[bukscore]: http://jd.bukkit.org/beta/apidocs/org/bukkit/scoreboard/package-summary.html
|
|
|
|
|
|
|
|
***/
|
|
|
|
|
2014-01-29 20:49:15 +01:00
|
|
|
var store = {},
|
2014-02-19 23:17:19 +01:00
|
|
|
bkBukkit = org.bukkit.Bukkit,
|
|
|
|
bkCow = org.bukkit.entity.Cow,
|
|
|
|
bkSound = org.bukkit.Sound,
|
|
|
|
bkOfflinePlayer = org.bukkit.OfflinePlayer,
|
2014-01-29 20:49:15 +01:00
|
|
|
scoreboardConfig = {
|
|
|
|
cowclicker: {
|
|
|
|
SIDEBAR: 'Cows Clicked'
|
|
|
|
}
|
|
|
|
};
|
2014-01-12 13:06:30 +01:00
|
|
|
var scoreboard = require('minigames/scoreboard')(scoreboardConfig);
|
2014-01-12 12:26:26 +01:00
|
|
|
|
2014-03-15 19:06:23 +01:00
|
|
|
var _onPlayerInteract = function( event ) {
|
2014-01-29 20:49:15 +01:00
|
|
|
var player = event.player,
|
|
|
|
clickedEntity = event.rightClicked,
|
|
|
|
loc = clickedEntity.location;
|
|
|
|
|
|
|
|
if ( !store[ player.name ] ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var sound = function( snd, vol, pitch ) {
|
|
|
|
loc.world.playSound( loc, snd, vol, pitch );
|
|
|
|
};
|
|
|
|
|
2014-02-19 23:17:19 +01:00
|
|
|
if ( clickedEntity instanceof bkCow) {
|
2014-01-29 20:49:15 +01:00
|
|
|
store[ player.name ].score++;
|
|
|
|
scoreboard.update( 'cowclicker', player, store[ player.name ].score );
|
2014-01-12 12:26:26 +01:00
|
|
|
|
2014-02-19 23:17:19 +01:00
|
|
|
bkBukkit.dispatchCommand( player, 'me clicked a cow!' );
|
|
|
|
sound( bkSound.CLICK, 1, 1 );
|
2014-01-29 20:49:15 +01:00
|
|
|
setTimeout( function( ) {
|
2014-02-19 23:17:19 +01:00
|
|
|
sound( bkSound.COW_HURT, 10, 0.85 ) ;
|
2014-01-29 20:49:15 +01:00
|
|
|
}, 200 );
|
|
|
|
}
|
2014-01-12 12:26:26 +01:00
|
|
|
};
|
2014-03-15 19:06:23 +01:00
|
|
|
var _onPlayerQuit = function( event ) {
|
2014-01-29 20:49:15 +01:00
|
|
|
_removePlayer( event.player );
|
2014-01-12 12:26:26 +01:00
|
|
|
};
|
2014-03-15 19:06:23 +01:00
|
|
|
var _onPlayerJoin = function( event ) {
|
2014-01-29 20:49:15 +01:00
|
|
|
var gamePlayer = store[event.player.name];
|
|
|
|
if ( gamePlayer ) {
|
|
|
|
_addPlayer( event.player, gamePlayer.score );
|
|
|
|
}
|
2014-01-12 12:26:26 +01:00
|
|
|
};
|
|
|
|
|
2014-01-29 20:49:15 +01:00
|
|
|
var _startGame = function( ) {
|
|
|
|
var p,
|
|
|
|
player;
|
|
|
|
if ( config.verbose ) {
|
|
|
|
console.log('Staring game: Cow Clicker');
|
|
|
|
}
|
|
|
|
|
|
|
|
events.on( 'player.PlayerQuitEvent', _onPlayerQuit );
|
|
|
|
events.on( 'player.PlayerJoinEvent', _onPlayerJoin );
|
|
|
|
events.on( 'player.PlayerInteractEntityEvent', _onPlayerInteract );
|
|
|
|
|
|
|
|
scoreboard.start();
|
|
|
|
|
|
|
|
store = persist( 'cowclicker', store );
|
|
|
|
for ( p in store ) {
|
|
|
|
player = server.getPlayer( p );
|
|
|
|
if ( player ) {
|
|
|
|
/*
|
|
|
|
only add online players
|
|
|
|
*/
|
|
|
|
var score = store[p].score;
|
|
|
|
_addPlayer( player, score );
|
2014-01-12 12:26:26 +01:00
|
|
|
}
|
2014-01-29 20:49:15 +01:00
|
|
|
}
|
2014-01-12 12:26:26 +01:00
|
|
|
};
|
2014-01-29 20:49:15 +01:00
|
|
|
|
|
|
|
var _addPlayer = function( player, score ) {
|
|
|
|
if ( config.verbose ) {
|
|
|
|
console.log( 'Adding player %s to Cow Clicker game', player );
|
|
|
|
}
|
|
|
|
if ( typeof score == 'undefined' ) {
|
|
|
|
score = 0;
|
|
|
|
}
|
|
|
|
store[ player.name ] = { score: score };
|
|
|
|
scoreboard.update( 'cowclicker', player, store[ player.name ].score);
|
|
|
|
|
|
|
|
player.sendMessage( 'Go forth and click some cows!' );
|
2014-01-12 12:26:26 +01:00
|
|
|
};
|
|
|
|
|
2014-01-29 20:49:15 +01:00
|
|
|
var _removePlayer = function( player, notify ) {
|
2014-01-12 12:26:26 +01:00
|
|
|
|
2014-02-19 23:17:19 +01:00
|
|
|
if ( player instanceof bkOfflinePlayer && player.player ) {
|
2014-01-29 20:49:15 +01:00
|
|
|
player = player.player;
|
|
|
|
}
|
2014-01-12 12:26:26 +01:00
|
|
|
|
2014-01-29 20:49:15 +01:00
|
|
|
if ( !store[player.name] ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if ( config.verbose ) {
|
|
|
|
console.log( 'Removing player %s from Cow Clicker', player );
|
|
|
|
}
|
|
|
|
|
|
|
|
var playerScore = store[ player.name ].score;
|
2014-01-12 12:26:26 +01:00
|
|
|
|
2014-01-29 20:49:15 +01:00
|
|
|
scoreboard.restore( player );
|
2014-01-12 12:26:26 +01:00
|
|
|
|
2014-01-29 20:49:15 +01:00
|
|
|
delete store[ player.name ];
|
|
|
|
if ( notify && player ) {
|
|
|
|
player.sendMessage( 'You clicked ' + playerScore + ' cows! ' +
|
|
|
|
'You must be tired after all that clicking.' );
|
|
|
|
}
|
2014-01-12 12:26:26 +01:00
|
|
|
};
|
2014-01-29 20:49:15 +01:00
|
|
|
|
|
|
|
var _removeAllPlayers = function( notify ) {
|
|
|
|
if ( typeof notify == 'undefined' ) {
|
|
|
|
notify = false;
|
|
|
|
}
|
|
|
|
for ( var p in store ) {
|
|
|
|
var player = server.getOfflinePlayer( p );
|
|
|
|
if ( player ) {
|
|
|
|
_removePlayer( player, notify );
|
2014-01-12 12:26:26 +01:00
|
|
|
}
|
2014-01-29 20:49:15 +01:00
|
|
|
delete store[p];
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var _stopGame = function( removePlayers ) {
|
|
|
|
if ( typeof removePlayers == 'undefined' ) {
|
|
|
|
removePlayers = true;
|
|
|
|
}
|
|
|
|
if ( config.verbose ) {
|
|
|
|
console.log( 'Stopping game: Cow Clicker' );
|
|
|
|
}
|
|
|
|
scoreboard.stop();
|
|
|
|
if ( !removePlayers ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
_removeAllPlayers( false );
|
|
|
|
persist( 'cowclicker', store.pers, 'w' );
|
2014-01-12 12:26:26 +01:00
|
|
|
|
|
|
|
};
|
|
|
|
/*
|
2014-01-29 20:49:15 +01:00
|
|
|
start the game automatically when this module is loaded.
|
|
|
|
*/
|
2014-01-12 12:26:26 +01:00
|
|
|
_startGame();
|
|
|
|
/*
|
2014-01-29 20:49:15 +01:00
|
|
|
players can join and leave the game by typing `jsp cowclicker`
|
|
|
|
*/
|
|
|
|
command( 'cowclicker', function( params, sender ) {
|
|
|
|
if ( !store[sender.name] ) {
|
|
|
|
_addPlayer( sender );
|
|
|
|
} else {
|
|
|
|
_removePlayer( sender );
|
|
|
|
}
|
2014-01-12 12:26:26 +01:00
|
|
|
});
|
|
|
|
/*
|
2014-01-29 20:49:15 +01:00
|
|
|
stop the game when ScriptCraft is unloaded.
|
|
|
|
*/
|
|
|
|
addUnloadHandler( function( ) {
|
|
|
|
_stopGame( false );
|
|
|
|
} );
|
2014-01-12 12:26:26 +01:00
|
|
|
|