2015-01-11 01:09:56 +01:00
|
|
|
'use strict';
|
|
|
|
/*global require, __plugin, exports, events, setTimeout */
|
2013-12-24 01:18:43 +01:00
|
|
|
/*************************************************************************
|
2014-01-04 19:39:49 +01:00
|
|
|
## Arrows Plugin
|
2013-12-24 01:18:43 +01:00
|
|
|
|
2013-12-26 16:38:24 +01:00
|
|
|
The arrows mod adds fancy arrows to the game. Arrows which...
|
2013-01-18 00:28:12 +01:00
|
|
|
|
2013-12-26 16:38:24 +01:00
|
|
|
* 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.
|
|
|
|
|
2013-12-29 00:02:50 +01:00
|
|
|
### Usage:
|
2013-12-26 16:38:24 +01:00
|
|
|
|
2013-12-30 22:33:12 +01:00
|
|
|
* `/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
|
2013-06-23 20:56:18 +02:00
|
|
|
|
2013-12-29 13:58:20 +01:00
|
|
|
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.
|
2013-01-18 00:28:12 +01:00
|
|
|
|
2013-12-24 01:18:43 +01:00
|
|
|
***/
|
2015-01-11 01:09:56 +01:00
|
|
|
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' ];
|
2013-12-24 01:18:43 +01:00
|
|
|
|
|
|
|
exports.arrows = arrows;
|
|
|
|
|
2014-01-29 20:49:15 +01:00
|
|
|
|
|
|
|
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 ) {
|
2015-01-11 01:09:56 +01:00
|
|
|
store.players[ player.name ] = n;
|
2014-01-29 20:49:15 +01:00
|
|
|
} else {
|
|
|
|
console.warn('arrows.' + n + ' No player ' + player);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
} )( i );
|
2013-12-24 01:18:43 +01:00
|
|
|
}
|
2013-01-18 00:28:12 +01:00
|
|
|
|
|
|
|
/*
|
2014-01-29 20:49:15 +01:00
|
|
|
called when the player chooses an arrow option from a menu sign
|
|
|
|
*/
|
|
|
|
var _onMenuChoice = function( event ) {
|
2015-01-11 01:09:56 +01:00
|
|
|
store.players[ event.player.name ] = event.number;
|
2013-12-24 01:18:43 +01:00
|
|
|
};
|
2015-01-11 01:09:56 +01:00
|
|
|
|
2014-01-29 20:49:15 +01:00
|
|
|
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 );
|
2014-01-05 16:20:29 +01:00
|
|
|
};
|
2013-12-24 01:18:43 +01:00
|
|
|
|
2013-01-18 00:28:12 +01:00
|
|
|
/*
|
2014-01-29 20:49:15 +01:00
|
|
|
event handler called when a projectile hits something
|
|
|
|
*/
|
2015-01-11 01:09:56 +01:00
|
|
|
function onBukkitArrowHit( event ) {
|
2014-01-29 20:49:15 +01:00
|
|
|
var projectile = event.entity,
|
2015-01-11 01:09:56 +01:00
|
|
|
world = projectile.world,
|
|
|
|
shooter = projectile.shooter,
|
|
|
|
fireworkCount = 5,
|
|
|
|
arrowType;
|
2014-01-29 20:49:15 +01:00
|
|
|
|
2015-01-11 01:09:56 +01:00
|
|
|
function launch(){
|
|
|
|
fireworks.firework( projectile.location );
|
|
|
|
if ( --fireworkCount ) {
|
|
|
|
setTimeout( launch, 2000 );
|
|
|
|
}
|
|
|
|
}
|
2014-02-19 23:17:19 +01:00
|
|
|
if (projectile instanceof bkArrow
|
|
|
|
&& shooter instanceof bkPlayer) {
|
2014-01-29 20:49:15 +01:00
|
|
|
|
2015-01-11 01:09:56 +01:00
|
|
|
arrowType = store.players[ shooter.name ];
|
2014-01-29 20:49:15 +01:00
|
|
|
|
|
|
|
switch ( arrowType ) {
|
|
|
|
case 1:
|
|
|
|
projectile.remove();
|
|
|
|
world.createExplosion( projectile.location, EXPLOSIVE_YIELD );
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
projectile.remove();
|
2015-01-11 01:09:56 +01:00
|
|
|
teleport(shooter, projectile.location);
|
2014-01-29 20:49:15 +01:00
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
projectile.remove();
|
2015-01-11 01:09:56 +01:00
|
|
|
new Drone(projectile.location).oak();
|
2014-01-29 20:49:15 +01:00
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
projectile.remove();
|
|
|
|
world.strikeLightning( projectile.location );
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
projectile.remove();
|
|
|
|
launch();
|
|
|
|
break;
|
2013-12-24 01:18:43 +01:00
|
|
|
}
|
2014-01-29 20:49:15 +01:00
|
|
|
}
|
2015-01-11 01:09:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
2013-12-24 01:18:43 +01:00
|
|
|
|