This repository has been archived on 2021-07-14. You can view files and clone it, but cannot push or open issues or pull requests.
scriptcraft/src/main/js/plugins/arrows.js

126 lines
3.5 KiB
JavaScript

/*************************************************************************
## Arrows Plugin
The arrows mod adds fancy arrows to the game. Arrows which...
* Launch fireworks.
* Explode on impact.
* Force Lightning to strike where they land.
* Teleport the player to the landing spot.
* Spawn Trees at the landing spot.
### Usage:
* `/js arrows.firework(self)` - A firework launches where the the arrow lands.
* `/js arrows.lightning(self)` - lightning strikes where the arrow lands.
* `/js arrows.teleport(self)` - makes player teleport to where arrow has landed.
* `/js arrows.flourish(self)` - makes a tree grow where the arrow lands.
* `/js arrows.explosive(self)` - makes arrows explode.
* `/js arrows.normal(self)` sets arrow type to normal.
* `/js arrows.sign(self)` turns a targeted sign into a Arrows menu
All of the above functions can take an optional player object or name
as a parameter. For example: `/js arrows.explosive('player23')` makes
player23's arrows explosive.
***/
var signs = require('signs'),
fireworks = require('fireworks'),
utils = require('utils'),
bkTeleportCause = org.bukkit.event.player.PlayerTeleportEvent.TeleportCause,
bkArrow = org.bukkit.entity.Arrow,
bkPlayer = org.bukkit.entity.Player,
bkTreeType = org.bukkit.TreeType,
EXPLOSIVE_YIELD = 2.5,
_store = { players: { } },
arrows = plugin( 'arrows', { store: _store }, true ),
i,
type,
_types = [ 'Normal', 'Explosive', 'Teleport', 'Flourish', 'Lightning', 'Firework' ];
exports.arrows = arrows;
for ( i = 0; i < _types.length; i++ ) {
type = _types[i].toLowerCase();
// iife (immediately-invoked function expression)
arrows[ type ] = ( function( n ) {
return function( player ) {
player = utils.player( player );
if ( player ) {
arrows.store.players[ player.name ] = n;
} else {
console.warn('arrows.' + n + ' No player ' + player);
}
};
} )( i );
}
/*
called when the player chooses an arrow option from a menu sign
*/
var _onMenuChoice = function( event ) {
arrows.store.players[ event.player.name ] = event.number;
};
var convertToArrowSign = signs.menu( 'Arrow', _types, _onMenuChoice );
/*
turn a sign into a menu of arrow choices
*/
arrows.sign = function( cmdSender ) {
var sign = signs.getTargetedBy( cmdSender );
if ( !sign ) {
throw new Error( 'You must first look at a sign!' );
}
return convertToArrowSign( sign, true );
};
/*
event handler called when a projectile hits something
*/
var _onArrowHit = function( listener, event ) {
var projectile = event.entity,
world = projectile.world,
shooter = projectile.shooter,
fireworkCount = 5,
arrowType,
launch = function( ) {
fireworks.firework( projectile.location );
if ( --fireworkCount ) {
setTimeout( launch, 2000 );
}
};
if (projectile instanceof bkArrow
&& shooter instanceof bkPlayer) {
arrowType = arrows.store.players[ shooter.name ];
switch ( arrowType ) {
case 1:
projectile.remove();
world.createExplosion( projectile.location, EXPLOSIVE_YIELD );
break;
case 2:
projectile.remove();
shooter.teleport( projectile.location, bkTeleportCause.PLUGIN );
break;
case 3:
projectile.remove();
world.generateTree( projectile.location, bkTreeType.BIG_TREE );
break;
case 4:
projectile.remove();
world.strikeLightning( projectile.location );
break;
case 5:
projectile.remove();
launch();
break;
}
}
};
events.on( 'entity.ProjectileHitEvent', _onArrowHit );