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
Robert Storlind b4af7553f9 Trivial typo
2015-05-06 21:50:57 +02:00

172 lines
4.6 KiB
JavaScript

'use strict';
/*global require, __plugin, exports, events, setTimeout */
/*************************************************************************
## 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 an 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 Drone = require('drone'),
teleport = require('teleport'),
signs = require('signs'),
fireworks = require('fireworks'),
utils = require('utils'),
bkArrow = org.bukkit.entity.Arrow,
bkPlayer = org.bukkit.entity.Player,
EXPLOSIVE_YIELD = 2.5,
store = persist('arrows',{ players: { } }),
arrows = {},
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 ) {
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 ) {
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
*/
function onBukkitArrowHit( event ) {
var projectile = event.entity,
world = projectile.world,
shooter = projectile.shooter,
fireworkCount = 5,
arrowType;
function launch(){
fireworks.firework( projectile.location );
if ( --fireworkCount ) {
setTimeout( launch, 2000 );
}
}
if (projectile instanceof bkArrow
&& shooter instanceof bkPlayer) {
arrowType = store.players[ shooter.name ];
switch ( arrowType ) {
case 1:
projectile.remove();
world.createExplosion( projectile.location, EXPLOSIVE_YIELD );
break;
case 2:
projectile.remove();
teleport(shooter, projectile.location);
break;
case 3:
projectile.remove();
new Drone(projectile.location).oak();
break;
case 4:
projectile.remove();
world.strikeLightning( projectile.location );
break;
case 5:
projectile.remove();
launch();
break;
}
}
}
function onCanaryArrowHit( event ) {
var projectile = event.projectile,
world = projectile.world,
shooter = projectile.owner,
fireworkCount = 5,
arrowType,
cmArrow = Packages.net.canarymod.api.entity.Arrow,
cmPlayer = Packages.net.canarymod.api.entity.living.humanoid.Player,
loc = projectile.location,
launch = function( ) {
fireworks.firework( loc);
if ( --fireworkCount ) {
setTimeout( launch, 2000 );
}
};
if (projectile instanceof cmArrow && shooter instanceof cmPlayer) {
arrowType = store.players[ shooter.name ];
switch ( arrowType ) {
case 1:
projectile.destroy();
world.makeExplosion( shooter, loc, EXPLOSIVE_YIELD, true );
break;
case 2:
projectile.destroy();
teleport(shooter, loc);
break;
case 3:
projectile.destroy();
new Drone( loc ).oak();
break;
case 4:
projectile.destroy();
world.makeLightningBolt( loc );
break;
case 5:
projectile.destroy();
launch();
break;
}
}
}
events.projectileHit( __plugin.bukkit ? onBukkitArrowHit : onCanaryArrowHit);