Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion editor/js/component.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -193,7 +193,8 @@ var Mechanic = {
WARP_SWAP: { name: 'Warp Swap', container: false, construct: MechanicWarpSwap },
WARP_TARGET: { name: 'Warp Target', container: false, construct: MechanicWarpTarget },
WARP_VALUE: { name: 'Warp Value', container: false, construct: MechanicWarpValue },
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf }
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf },
SET_GLOW: { name: 'Set Glow', container: false, construct: MechanicSetGlow }
};

var saveIndex;
Expand DownExpand Up@@ -2504,6 +2505,9 @@ function MechanicParticleProjectile()
.setTooltip('How long in seconds before the projectile will expire in case it doesn\'t hit anything')
);

//Add missile options (homing projectile)
addMissileOptions(this, true);

addEffectOptions(this, true);
}

Expand DownExpand Up@@ -3239,6 +3243,21 @@ function MechanicWolf()
);
}

extend('MechanicSetGlow', 'Component');
function MechanicSetGlow()
{
this.super('Set Glow', Type.MECHANIC, false);

this.description = 'glow target with color (only caster can see it)';

this.data.push(new ListValue('Glow Color', 'color', getGlowColors(), 'White')
.setTooltip('The color of glowing')
);
this.data.push(new AttributeValue('Duration', 'seconds', 10, 0)
.setTooltip('How long should it glow for')
);
}

// The active component being edited or added to
var activeComponent = undefined;

Expand DownExpand Up@@ -3391,7 +3410,29 @@ function addParticleOptions(component) {
component.data.push(new DoubleValue('Speed', 'speed', 0.1).setTooltip('Speed of the particle. For some particles controls other parameters, such as size.')
);
}
function addMissileOptions(component, optional)
{
var opt = appendNone;
if(optional){
opt = appendMissileOptional;
component.data.push(new ListValue('Use Missile', 'use-missile', [ 'True', 'False' ], 'False')
.setTooltip('Whether or not to use the missile (homing projectile)..')
);
}

component.data.push(opt(new StringValue('Missile Target', 'missile_target', "none")
.setTooltip('The target you would like to home at'))
);
component.data.push(opt(new DoubleValue('Missile Threshold', 'missile_threshold', 3)
.setTooltip('The threshold of the missile'))
);
component.data.push(opt(new DoubleValue('Missile Angle', 'missile_angle', 3)
.setTooltip('The angle of the missile will turn'))
);
component.data.push(opt(new DoubleValue('Missile Delay', 'missile_delay', 0)
.setTooltip('The delay before auto homing the target'))
);
}
function addEffectOptions(component, optional)
{
var opt = appendNone;
Expand DownExpand Up@@ -3469,6 +3510,11 @@ function appendOptional(value)
value.requireValue('use-effect', [ 'True' ]);
return value;
}
function appendMissileOptional(value)
{
value.requireValue('use-missile', [ 'True' ]);
return value;
}

function appendNone(value)
{
Expand Down
21 changes: 21 additions & 0 deletions editor/js/data/data.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -66,6 +66,9 @@ function getBadPotions() {
function getDyes() {
return DYES;
}
function getGlowColors(){
return GLOW_COLORS;
}

const GOOD_POTIONS = [
"Speed",
Expand DownExpand Up@@ -118,4 +121,22 @@ const DYES = [
'RED',
'WHITE',
'YELLOW'
];
const GLOW_COLORS = ['BLACK',
'DARK_BLUE',
'DARK_GREEN',
'DARK_AQUA',
'DARK_RED',
'DARK_PURPLE',
'GOLD',
'GRAY',
'DARK_GRAY',
'BLUE',
'GREEN',
'AQUA',
'RED',
'PURPLE',
'YELLOW',
'WHITE',
'NONE'
];
Binary file addedlib/GlowAPI_v1.4.6-SNAPSHOT.jar
Binary file not shown.
9 changes: 8 additions & 1 deletion pom.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -142,9 +142,16 @@
<dependency>
<groupId>LibsDisguises</groupId>
<artifactId>LibsDisguises</artifactId>
<version>10.0.19</version>
<version>10.0.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.InventivetalentDev</groupId>
<artifactId>GlowAPI</artifactId>
<version>1.4.6-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/lib/GlowAPI_v1.4.6-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/sucy/skill/SkillAPI.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,7 +74,7 @@
* <p>You can retrieve a reference to this through Bukkit the same way as any other plugin.</p>
*/
public class SkillAPI extends JavaPlugin {
private static SkillAPI singleton;
public static SkillAPI singleton;

private final HashMap<String, Skill> skills = new HashMap<>();
private final HashMap<String, RPGClass> classes = new HashMap<>();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@
*/
package com.sucy.skill.api.projectile;

import com.sucy.skill.SkillAPI;
import com.sucy.skill.api.Settings;
import com.sucy.skill.api.event.ParticleProjectileExpireEvent;
import com.sucy.skill.api.event.ParticleProjectileHitEvent;
Expand All@@ -34,8 +35,10 @@
import com.sucy.skill.api.util.ParticleHelper;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import java.util.ArrayList;
Expand DownExpand Up@@ -75,7 +78,12 @@ public class ParticleProjectile extends CustomProjectile
private int freq;
private int life;
private Vector gravity;
private boolean pierce;
private boolean pierce;
private Entity missileTarget;
private double missileThreshold;
private double missileAngle;
private double missileDelay;
private boolean missileStarted = false;

/**
* Constructor
Expand All@@ -96,10 +104,42 @@ public ParticleProjectile(LivingEntity shooter, int level, Location loc, Setting
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = null;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}
public ParticleProjectile(LivingEntity shooter, int level, Location loc, Settings settings, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
super(shooter);

this.loc = loc;
this.settings = settings;
this.vel = loc.getDirection().multiply(settings.getAttr(SPEED, level, 1.0));
this.freq = (int) (20 * settings.getDouble(FREQUENCY, 0.5));
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = missileTarget;
this.missileThreshold = missileThreshold;
this.missileAngle = missileAngle;
this.missileDelay = missileDelay;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
//Missile delay
if(missileDelay == 0){
missileStarted = true;
}else {
new BukkitRunnable() {

@Override
public void run() {
missileStarted = true;
}
}.runTaskLater(SkillAPI.singleton, Math.round(missileDelay * 20));
}
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}

Expand DownExpand Up@@ -224,6 +264,28 @@ public void run()
cancel();
Bukkit.getPluginManager().callEvent(new ParticleProjectileExpireEvent(this));
}

//Missile
if(missileTarget!=null && missileStarted){
final Vector vel = getVelocity();
final double speed = vel.length();
final Vector dir = vel.multiply(1 / speed);
final Vector towards = missileTarget.getLocation().toVector().subtract(getLocation().toVector());
final Vector targetDir = towards.normalize();
final double dot = dir.dot(targetDir);//degree of inaccurate
if (dot >= missileThreshold) {
setVelocity(targetDir.multiply(speed));
} else {
Vector currentDir = vel.normalize();
Vector sum = currentDir.add(targetDir);
Vector newDir = sum.divide(new Vector(2,2,2));
Vector normalizedNewDir = newDir.normalize();
setVelocity(normalizedNewDir.multiply(speed));
//final double m = Math.sin()
//baseProjectile.setVelocity(result);
}

}
}

/**
Expand All@@ -240,15 +302,15 @@ public void run()
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
ArrayList<Vector> dirs = calcSpread(center, angle, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Vector dir : dirs)
{
Location l = loc.clone();
l.setDirection(dir);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand All@@ -269,15 +331,15 @@ public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int lev
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
Vector vel = new Vector(0, 1, 0);
ArrayList<Location> locs = calcRain(center, radius, height, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Location l : locs)
{
l.setDirection(vel);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -291,5 +291,6 @@ private static void register(final EffectComponent component) {
register(new WarpTargetMechanic());
register(new WarpValueMechanic());
register(new WolfMechanic());
register(new SetGlowMechanic());
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,6 +40,7 @@
import com.sucy.skill.cast.IndicatorType;
import com.sucy.skill.cast.ProjectileIndicator;
import com.sucy.skill.dynamic.TempEntity;
import com.sucy.skill.dynamic.target.RememberTarget;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
Expand All@@ -66,6 +67,13 @@ public class ParticleProjectileMechanic extends MechanicComponent implements Pro
private static final String UPWARD = "upward";
private static final String FORWARD = "forward";

//Missile
private static final String MISSILE_TARGET = "missile_target";
private static final String MISSILE_THRESHOLD = "missile_threshold";
private static final String MISSILE_ANGLE = "missile_angle";
private static final String MISSILE_DELAY = "missile_delay";

//Effect
private static final String USE_EFFECT = "use-effect";
private static final String EFFECT_KEY = "effect-key";

Expand DownExpand Up@@ -144,6 +152,18 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy.set(ParticleProjectile.SPEED, parseValues(caster, ParticleProjectile.SPEED, level, 1), 0);
copy.set(ParticleHelper.PARTICLES_KEY, parseValues(caster, ParticleHelper.PARTICLES_KEY, level, 1), 0);
copy.set(ParticleHelper.RADIUS_KEY, parseValues(caster, ParticleHelper.RADIUS_KEY, level, 0), 0);
final List<LivingEntity> missileTargets = RememberTarget.remember(caster, settings.getString(MISSILE_TARGET, "_none"));

LivingEntity missileTarget = null;
double missileThreshold = 0;
double missileAngle = 0;
double missileDelay = 0;
if(missileTargets.size() > 0) {
missileTarget = missileTargets.get(0);
missileThreshold = settings.getDouble(MISSILE_THRESHOLD);
missileAngle = settings.getDouble(MISSILE_ANGLE);
missileDelay = settings.getDouble(MISSILE_DELAY);
}

// Fire from each target
for (LivingEntity target : targets) {
Expand All@@ -154,7 +174,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
if (spread.equals("rain")) {
double radius = parseValues(caster, RADIUS, level, 2.0);
double height = parseValues(caster, HEIGHT, level, 8.0);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this, missileTarget, missileThreshold, missileAngle, missileDelay);
} else {
Vector dir = target.getLocation().getDirection();

Expand All@@ -179,7 +199,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy,
angle,
amount,
this
this, missileTarget, missileThreshold, missileAngle, missileDelay
);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion editor/js/component.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -193,7 +193,8 @@ var Mechanic = {
WARP_SWAP: { name: 'Warp Swap', container: false, construct: MechanicWarpSwap },
WARP_TARGET: { name: 'Warp Target', container: false, construct: MechanicWarpTarget },
WARP_VALUE: { name: 'Warp Value', container: false, construct: MechanicWarpValue },
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf }
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf },
SET_GLOW: { name: 'Set Glow', container: false, construct: MechanicSetGlow }
};

var saveIndex;
Expand DownExpand Up@@ -2504,6 +2505,9 @@ function MechanicParticleProjectile()
.setTooltip('How long in seconds before the projectile will expire in case it doesn\'t hit anything')
);

//Add missile options (homing projectile)
addMissileOptions(this, true);

addEffectOptions(this, true);
}

Expand DownExpand Up@@ -3239,6 +3243,21 @@ function MechanicWolf()
);
}

extend('MechanicSetGlow', 'Component');
function MechanicSetGlow()
{
this.super('Set Glow', Type.MECHANIC, false);

this.description = 'glow target with color (only caster can see it)';

this.data.push(new ListValue('Glow Color', 'color', getGlowColors(), 'White')
.setTooltip('The color of glowing')
);
this.data.push(new AttributeValue('Duration', 'seconds', 10, 0)
.setTooltip('How long should it glow for')
);
}

// The active component being edited or added to
var activeComponent = undefined;

Expand DownExpand Up@@ -3391,7 +3410,29 @@ function addParticleOptions(component) {
component.data.push(new DoubleValue('Speed', 'speed', 0.1).setTooltip('Speed of the particle. For some particles controls other parameters, such as size.')
);
}
function addMissileOptions(component, optional)
{
var opt = appendNone;
if(optional){
opt = appendMissileOptional;
component.data.push(new ListValue('Use Missile', 'use-missile', [ 'True', 'False' ], 'False')
.setTooltip('Whether or not to use the missile (homing projectile)..')
);
}

component.data.push(opt(new StringValue('Missile Target', 'missile_target', "none")
.setTooltip('The target you would like to home at'))
);
component.data.push(opt(new DoubleValue('Missile Threshold', 'missile_threshold', 3)
.setTooltip('The threshold of the missile'))
);
component.data.push(opt(new DoubleValue('Missile Angle', 'missile_angle', 3)
.setTooltip('The angle of the missile will turn'))
);
component.data.push(opt(new DoubleValue('Missile Delay', 'missile_delay', 0)
.setTooltip('The delay before auto homing the target'))
);
}
function addEffectOptions(component, optional)
{
var opt = appendNone;
Expand DownExpand Up@@ -3469,6 +3510,11 @@ function appendOptional(value)
value.requireValue('use-effect', [ 'True' ]);
return value;
}
function appendMissileOptional(value)
{
value.requireValue('use-missile', [ 'True' ]);
return value;
}

function appendNone(value)
{
Expand Down
21 changes: 21 additions & 0 deletions editor/js/data/data.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -66,6 +66,9 @@ function getBadPotions() {
function getDyes() {
return DYES;
}
function getGlowColors(){
return GLOW_COLORS;
}

const GOOD_POTIONS = [
"Speed",
Expand DownExpand Up@@ -118,4 +121,22 @@ const DYES = [
'RED',
'WHITE',
'YELLOW'
];
const GLOW_COLORS = ['BLACK',
'DARK_BLUE',
'DARK_GREEN',
'DARK_AQUA',
'DARK_RED',
'DARK_PURPLE',
'GOLD',
'GRAY',
'DARK_GRAY',
'BLUE',
'GREEN',
'AQUA',
'RED',
'PURPLE',
'YELLOW',
'WHITE',
'NONE'
];
Binary file addedlib/GlowAPI_v1.4.6-SNAPSHOT.jar
Binary file not shown.
9 changes: 8 additions & 1 deletion pom.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -142,9 +142,16 @@
<dependency>
<groupId>LibsDisguises</groupId>
<artifactId>LibsDisguises</artifactId>
<version>10.0.19</version>
<version>10.0.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.InventivetalentDev</groupId>
<artifactId>GlowAPI</artifactId>
<version>1.4.6-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/lib/GlowAPI_v1.4.6-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/sucy/skill/SkillAPI.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,7 +74,7 @@
* <p>You can retrieve a reference to this through Bukkit the same way as any other plugin.</p>
*/
public class SkillAPI extends JavaPlugin {
private static SkillAPI singleton;
public static SkillAPI singleton;

private final HashMap<String, Skill> skills = new HashMap<>();
private final HashMap<String, RPGClass> classes = new HashMap<>();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@
*/
package com.sucy.skill.api.projectile;

import com.sucy.skill.SkillAPI;
import com.sucy.skill.api.Settings;
import com.sucy.skill.api.event.ParticleProjectileExpireEvent;
import com.sucy.skill.api.event.ParticleProjectileHitEvent;
Expand All@@ -34,8 +35,10 @@
import com.sucy.skill.api.util.ParticleHelper;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import java.util.ArrayList;
Expand DownExpand Up@@ -75,7 +78,12 @@ public class ParticleProjectile extends CustomProjectile
private int freq;
private int life;
private Vector gravity;
private boolean pierce;
private boolean pierce;
private Entity missileTarget;
private double missileThreshold;
private double missileAngle;
private double missileDelay;
private boolean missileStarted = false;

/**
* Constructor
Expand All@@ -96,10 +104,42 @@ public ParticleProjectile(LivingEntity shooter, int level, Location loc, Setting
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = null;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}
public ParticleProjectile(LivingEntity shooter, int level, Location loc, Settings settings, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
super(shooter);

this.loc = loc;
this.settings = settings;
this.vel = loc.getDirection().multiply(settings.getAttr(SPEED, level, 1.0));
this.freq = (int) (20 * settings.getDouble(FREQUENCY, 0.5));
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = missileTarget;
this.missileThreshold = missileThreshold;
this.missileAngle = missileAngle;
this.missileDelay = missileDelay;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
//Missile delay
if(missileDelay == 0){
missileStarted = true;
}else {
new BukkitRunnable() {

@Override
public void run() {
missileStarted = true;
}
}.runTaskLater(SkillAPI.singleton, Math.round(missileDelay * 20));
}
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}

Expand DownExpand Up@@ -224,6 +264,28 @@ public void run()
cancel();
Bukkit.getPluginManager().callEvent(new ParticleProjectileExpireEvent(this));
}

//Missile
if(missileTarget!=null && missileStarted){
final Vector vel = getVelocity();
final double speed = vel.length();
final Vector dir = vel.multiply(1 / speed);
final Vector towards = missileTarget.getLocation().toVector().subtract(getLocation().toVector());
final Vector targetDir = towards.normalize();
final double dot = dir.dot(targetDir);//degree of inaccurate
if (dot >= missileThreshold) {
setVelocity(targetDir.multiply(speed));
} else {
Vector currentDir = vel.normalize();
Vector sum = currentDir.add(targetDir);
Vector newDir = sum.divide(new Vector(2,2,2));
Vector normalizedNewDir = newDir.normalize();
setVelocity(normalizedNewDir.multiply(speed));
//final double m = Math.sin()
//baseProjectile.setVelocity(result);
}

}
}

/**
Expand All@@ -240,15 +302,15 @@ public void run()
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
ArrayList<Vector> dirs = calcSpread(center, angle, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Vector dir : dirs)
{
Location l = loc.clone();
l.setDirection(dir);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand All@@ -269,15 +331,15 @@ public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int lev
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
Vector vel = new Vector(0, 1, 0);
ArrayList<Location> locs = calcRain(center, radius, height, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Location l : locs)
{
l.setDirection(vel);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -291,5 +291,6 @@ private static void register(final EffectComponent component) {
register(new WarpTargetMechanic());
register(new WarpValueMechanic());
register(new WolfMechanic());
register(new SetGlowMechanic());
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,6 +40,7 @@
import com.sucy.skill.cast.IndicatorType;
import com.sucy.skill.cast.ProjectileIndicator;
import com.sucy.skill.dynamic.TempEntity;
import com.sucy.skill.dynamic.target.RememberTarget;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
Expand All@@ -66,6 +67,13 @@ public class ParticleProjectileMechanic extends MechanicComponent implements Pro
private static final String UPWARD = "upward";
private static final String FORWARD = "forward";

//Missile
private static final String MISSILE_TARGET = "missile_target";
private static final String MISSILE_THRESHOLD = "missile_threshold";
private static final String MISSILE_ANGLE = "missile_angle";
private static final String MISSILE_DELAY = "missile_delay";

//Effect
private static final String USE_EFFECT = "use-effect";
private static final String EFFECT_KEY = "effect-key";

Expand DownExpand Up@@ -144,6 +152,18 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy.set(ParticleProjectile.SPEED, parseValues(caster, ParticleProjectile.SPEED, level, 1), 0);
copy.set(ParticleHelper.PARTICLES_KEY, parseValues(caster, ParticleHelper.PARTICLES_KEY, level, 1), 0);
copy.set(ParticleHelper.RADIUS_KEY, parseValues(caster, ParticleHelper.RADIUS_KEY, level, 0), 0);
final List<LivingEntity> missileTargets = RememberTarget.remember(caster, settings.getString(MISSILE_TARGET, "_none"));

LivingEntity missileTarget = null;
double missileThreshold = 0;
double missileAngle = 0;
double missileDelay = 0;
if(missileTargets.size() > 0) {
missileTarget = missileTargets.get(0);
missileThreshold = settings.getDouble(MISSILE_THRESHOLD);
missileAngle = settings.getDouble(MISSILE_ANGLE);
missileDelay = settings.getDouble(MISSILE_DELAY);
}

// Fire from each target
for (LivingEntity target : targets) {
Expand All@@ -154,7 +174,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
if (spread.equals("rain")) {
double radius = parseValues(caster, RADIUS, level, 2.0);
double height = parseValues(caster, HEIGHT, level, 8.0);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this, missileTarget, missileThreshold, missileAngle, missileDelay);
} else {
Vector dir = target.getLocation().getDirection();

Expand All@@ -179,7 +199,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy,
angle,
amount,
this
this, missileTarget, missileThreshold, missileAngle, missileDelay
);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion editor/js/component.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -193,7 +193,8 @@ var Mechanic = {
WARP_SWAP: { name: 'Warp Swap', container: false, construct: MechanicWarpSwap },
WARP_TARGET: { name: 'Warp Target', container: false, construct: MechanicWarpTarget },
WARP_VALUE: { name: 'Warp Value', container: false, construct: MechanicWarpValue },
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf }
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf },
SET_GLOW: { name: 'Set Glow', container: false, construct: MechanicSetGlow }
};

var saveIndex;
Expand DownExpand Up@@ -2504,6 +2505,9 @@ function MechanicParticleProjectile()
.setTooltip('How long in seconds before the projectile will expire in case it doesn\'t hit anything')
);

//Add missile options (homing projectile)
addMissileOptions(this, true);

addEffectOptions(this, true);
}

Expand DownExpand Up@@ -3239,6 +3243,21 @@ function MechanicWolf()
);
}

extend('MechanicSetGlow', 'Component');
function MechanicSetGlow()
{
this.super('Set Glow', Type.MECHANIC, false);

this.description = 'glow target with color (only caster can see it)';

this.data.push(new ListValue('Glow Color', 'color', getGlowColors(), 'White')
.setTooltip('The color of glowing')
);
this.data.push(new AttributeValue('Duration', 'seconds', 10, 0)
.setTooltip('How long should it glow for')
);
}

// The active component being edited or added to
var activeComponent = undefined;

Expand DownExpand Up@@ -3391,7 +3410,29 @@ function addParticleOptions(component) {
component.data.push(new DoubleValue('Speed', 'speed', 0.1).setTooltip('Speed of the particle. For some particles controls other parameters, such as size.')
);
}
function addMissileOptions(component, optional)
{
var opt = appendNone;
if(optional){
opt = appendMissileOptional;
component.data.push(new ListValue('Use Missile', 'use-missile', [ 'True', 'False' ], 'False')
.setTooltip('Whether or not to use the missile (homing projectile)..')
);
}

component.data.push(opt(new StringValue('Missile Target', 'missile_target', "none")
.setTooltip('The target you would like to home at'))
);
component.data.push(opt(new DoubleValue('Missile Threshold', 'missile_threshold', 3)
.setTooltip('The threshold of the missile'))
);
component.data.push(opt(new DoubleValue('Missile Angle', 'missile_angle', 3)
.setTooltip('The angle of the missile will turn'))
);
component.data.push(opt(new DoubleValue('Missile Delay', 'missile_delay', 0)
.setTooltip('The delay before auto homing the target'))
);
}
function addEffectOptions(component, optional)
{
var opt = appendNone;
Expand DownExpand Up@@ -3469,6 +3510,11 @@ function appendOptional(value)
value.requireValue('use-effect', [ 'True' ]);
return value;
}
function appendMissileOptional(value)
{
value.requireValue('use-missile', [ 'True' ]);
return value;
}

function appendNone(value)
{
Expand Down
21 changes: 21 additions & 0 deletions editor/js/data/data.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -66,6 +66,9 @@ function getBadPotions() {
function getDyes() {
return DYES;
}
function getGlowColors(){
return GLOW_COLORS;
}

const GOOD_POTIONS = [
"Speed",
Expand DownExpand Up@@ -118,4 +121,22 @@ const DYES = [
'RED',
'WHITE',
'YELLOW'
];
const GLOW_COLORS = ['BLACK',
'DARK_BLUE',
'DARK_GREEN',
'DARK_AQUA',
'DARK_RED',
'DARK_PURPLE',
'GOLD',
'GRAY',
'DARK_GRAY',
'BLUE',
'GREEN',
'AQUA',
'RED',
'PURPLE',
'YELLOW',
'WHITE',
'NONE'
];
Binary file addedlib/GlowAPI_v1.4.6-SNAPSHOT.jar
Binary file not shown.
9 changes: 8 additions & 1 deletion pom.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -142,9 +142,16 @@
<dependency>
<groupId>LibsDisguises</groupId>
<artifactId>LibsDisguises</artifactId>
<version>10.0.19</version>
<version>10.0.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.InventivetalentDev</groupId>
<artifactId>GlowAPI</artifactId>
<version>1.4.6-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/lib/GlowAPI_v1.4.6-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/sucy/skill/SkillAPI.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,7 +74,7 @@
* <p>You can retrieve a reference to this through Bukkit the same way as any other plugin.</p>
*/
public class SkillAPI extends JavaPlugin {
private static SkillAPI singleton;
public static SkillAPI singleton;

private final HashMap<String, Skill> skills = new HashMap<>();
private final HashMap<String, RPGClass> classes = new HashMap<>();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@
*/
package com.sucy.skill.api.projectile;

import com.sucy.skill.SkillAPI;
import com.sucy.skill.api.Settings;
import com.sucy.skill.api.event.ParticleProjectileExpireEvent;
import com.sucy.skill.api.event.ParticleProjectileHitEvent;
Expand All@@ -34,8 +35,10 @@
import com.sucy.skill.api.util.ParticleHelper;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import java.util.ArrayList;
Expand DownExpand Up@@ -75,7 +78,12 @@ public class ParticleProjectile extends CustomProjectile
private int freq;
private int life;
private Vector gravity;
private boolean pierce;
private boolean pierce;
private Entity missileTarget;
private double missileThreshold;
private double missileAngle;
private double missileDelay;
private boolean missileStarted = false;

/**
* Constructor
Expand All@@ -96,10 +104,42 @@ public ParticleProjectile(LivingEntity shooter, int level, Location loc, Setting
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = null;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}
public ParticleProjectile(LivingEntity shooter, int level, Location loc, Settings settings, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
super(shooter);

this.loc = loc;
this.settings = settings;
this.vel = loc.getDirection().multiply(settings.getAttr(SPEED, level, 1.0));
this.freq = (int) (20 * settings.getDouble(FREQUENCY, 0.5));
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = missileTarget;
this.missileThreshold = missileThreshold;
this.missileAngle = missileAngle;
this.missileDelay = missileDelay;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
//Missile delay
if(missileDelay == 0){
missileStarted = true;
}else {
new BukkitRunnable() {

@Override
public void run() {
missileStarted = true;
}
}.runTaskLater(SkillAPI.singleton, Math.round(missileDelay * 20));
}
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}

Expand DownExpand Up@@ -224,6 +264,28 @@ public void run()
cancel();
Bukkit.getPluginManager().callEvent(new ParticleProjectileExpireEvent(this));
}

//Missile
if(missileTarget!=null && missileStarted){
final Vector vel = getVelocity();
final double speed = vel.length();
final Vector dir = vel.multiply(1 / speed);
final Vector towards = missileTarget.getLocation().toVector().subtract(getLocation().toVector());
final Vector targetDir = towards.normalize();
final double dot = dir.dot(targetDir);//degree of inaccurate
if (dot >= missileThreshold) {
setVelocity(targetDir.multiply(speed));
} else {
Vector currentDir = vel.normalize();
Vector sum = currentDir.add(targetDir);
Vector newDir = sum.divide(new Vector(2,2,2));
Vector normalizedNewDir = newDir.normalize();
setVelocity(normalizedNewDir.multiply(speed));
//final double m = Math.sin()
//baseProjectile.setVelocity(result);
}

}
}

/**
Expand All@@ -240,15 +302,15 @@ public void run()
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
ArrayList<Vector> dirs = calcSpread(center, angle, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Vector dir : dirs)
{
Location l = loc.clone();
l.setDirection(dir);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand All@@ -269,15 +331,15 @@ public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int lev
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
Vector vel = new Vector(0, 1, 0);
ArrayList<Location> locs = calcRain(center, radius, height, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Location l : locs)
{
l.setDirection(vel);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -291,5 +291,6 @@ private static void register(final EffectComponent component) {
register(new WarpTargetMechanic());
register(new WarpValueMechanic());
register(new WolfMechanic());
register(new SetGlowMechanic());
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,6 +40,7 @@
import com.sucy.skill.cast.IndicatorType;
import com.sucy.skill.cast.ProjectileIndicator;
import com.sucy.skill.dynamic.TempEntity;
import com.sucy.skill.dynamic.target.RememberTarget;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
Expand All@@ -66,6 +67,13 @@ public class ParticleProjectileMechanic extends MechanicComponent implements Pro
private static final String UPWARD = "upward";
private static final String FORWARD = "forward";

//Missile
private static final String MISSILE_TARGET = "missile_target";
private static final String MISSILE_THRESHOLD = "missile_threshold";
private static final String MISSILE_ANGLE = "missile_angle";
private static final String MISSILE_DELAY = "missile_delay";

//Effect
private static final String USE_EFFECT = "use-effect";
private static final String EFFECT_KEY = "effect-key";

Expand DownExpand Up@@ -144,6 +152,18 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy.set(ParticleProjectile.SPEED, parseValues(caster, ParticleProjectile.SPEED, level, 1), 0);
copy.set(ParticleHelper.PARTICLES_KEY, parseValues(caster, ParticleHelper.PARTICLES_KEY, level, 1), 0);
copy.set(ParticleHelper.RADIUS_KEY, parseValues(caster, ParticleHelper.RADIUS_KEY, level, 0), 0);
final List<LivingEntity> missileTargets = RememberTarget.remember(caster, settings.getString(MISSILE_TARGET, "_none"));

LivingEntity missileTarget = null;
double missileThreshold = 0;
double missileAngle = 0;
double missileDelay = 0;
if(missileTargets.size() > 0) {
missileTarget = missileTargets.get(0);
missileThreshold = settings.getDouble(MISSILE_THRESHOLD);
missileAngle = settings.getDouble(MISSILE_ANGLE);
missileDelay = settings.getDouble(MISSILE_DELAY);
}

// Fire from each target
for (LivingEntity target : targets) {
Expand All@@ -154,7 +174,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
if (spread.equals("rain")) {
double radius = parseValues(caster, RADIUS, level, 2.0);
double height = parseValues(caster, HEIGHT, level, 8.0);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this, missileTarget, missileThreshold, missileAngle, missileDelay);
} else {
Vector dir = target.getLocation().getDirection();

Expand All@@ -179,7 +199,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy,
angle,
amount,
this
this, missileTarget, missileThreshold, missileAngle, missileDelay
);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion editor/js/component.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -193,7 +193,8 @@ var Mechanic = {
WARP_SWAP: { name: 'Warp Swap', container: false, construct: MechanicWarpSwap },
WARP_TARGET: { name: 'Warp Target', container: false, construct: MechanicWarpTarget },
WARP_VALUE: { name: 'Warp Value', container: false, construct: MechanicWarpValue },
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf }
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf },
SET_GLOW: { name: 'Set Glow', container: false, construct: MechanicSetGlow }
};

var saveIndex;
Expand DownExpand Up@@ -2504,6 +2505,9 @@ function MechanicParticleProjectile()
.setTooltip('How long in seconds before the projectile will expire in case it doesn\'t hit anything')
);

//Add missile options (homing projectile)
addMissileOptions(this, true);

addEffectOptions(this, true);
}

Expand DownExpand Up@@ -3239,6 +3243,21 @@ function MechanicWolf()
);
}

extend('MechanicSetGlow', 'Component');
function MechanicSetGlow()
{
this.super('Set Glow', Type.MECHANIC, false);

this.description = 'glow target with color (only caster can see it)';

this.data.push(new ListValue('Glow Color', 'color', getGlowColors(), 'White')
.setTooltip('The color of glowing')
);
this.data.push(new AttributeValue('Duration', 'seconds', 10, 0)
.setTooltip('How long should it glow for')
);
}

// The active component being edited or added to
var activeComponent = undefined;

Expand DownExpand Up@@ -3391,7 +3410,29 @@ function addParticleOptions(component) {
component.data.push(new DoubleValue('Speed', 'speed', 0.1).setTooltip('Speed of the particle. For some particles controls other parameters, such as size.')
);
}
function addMissileOptions(component, optional)
{
var opt = appendNone;
if(optional){
opt = appendMissileOptional;
component.data.push(new ListValue('Use Missile', 'use-missile', [ 'True', 'False' ], 'False')
.setTooltip('Whether or not to use the missile (homing projectile)..')
);
}

component.data.push(opt(new StringValue('Missile Target', 'missile_target', "none")
.setTooltip('The target you would like to home at'))
);
component.data.push(opt(new DoubleValue('Missile Threshold', 'missile_threshold', 3)
.setTooltip('The threshold of the missile'))
);
component.data.push(opt(new DoubleValue('Missile Angle', 'missile_angle', 3)
.setTooltip('The angle of the missile will turn'))
);
component.data.push(opt(new DoubleValue('Missile Delay', 'missile_delay', 0)
.setTooltip('The delay before auto homing the target'))
);
}
function addEffectOptions(component, optional)
{
var opt = appendNone;
Expand DownExpand Up@@ -3469,6 +3510,11 @@ function appendOptional(value)
value.requireValue('use-effect', [ 'True' ]);
return value;
}
function appendMissileOptional(value)
{
value.requireValue('use-missile', [ 'True' ]);
return value;
}

function appendNone(value)
{
Expand Down
21 changes: 21 additions & 0 deletions editor/js/data/data.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -66,6 +66,9 @@ function getBadPotions() {
function getDyes() {
return DYES;
}
function getGlowColors(){
return GLOW_COLORS;
}

const GOOD_POTIONS = [
"Speed",
Expand DownExpand Up@@ -118,4 +121,22 @@ const DYES = [
'RED',
'WHITE',
'YELLOW'
];
const GLOW_COLORS = ['BLACK',
'DARK_BLUE',
'DARK_GREEN',
'DARK_AQUA',
'DARK_RED',
'DARK_PURPLE',
'GOLD',
'GRAY',
'DARK_GRAY',
'BLUE',
'GREEN',
'AQUA',
'RED',
'PURPLE',
'YELLOW',
'WHITE',
'NONE'
];
Binary file addedlib/GlowAPI_v1.4.6-SNAPSHOT.jar
Binary file not shown.
9 changes: 8 additions & 1 deletion pom.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -142,9 +142,16 @@
<dependency>
<groupId>LibsDisguises</groupId>
<artifactId>LibsDisguises</artifactId>
<version>10.0.19</version>
<version>10.0.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.InventivetalentDev</groupId>
<artifactId>GlowAPI</artifactId>
<version>1.4.6-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/lib/GlowAPI_v1.4.6-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/sucy/skill/SkillAPI.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,7 +74,7 @@
* <p>You can retrieve a reference to this through Bukkit the same way as any other plugin.</p>
*/
public class SkillAPI extends JavaPlugin {
private static SkillAPI singleton;
public static SkillAPI singleton;

private final HashMap<String, Skill> skills = new HashMap<>();
private final HashMap<String, RPGClass> classes = new HashMap<>();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@
*/
package com.sucy.skill.api.projectile;

import com.sucy.skill.SkillAPI;
import com.sucy.skill.api.Settings;
import com.sucy.skill.api.event.ParticleProjectileExpireEvent;
import com.sucy.skill.api.event.ParticleProjectileHitEvent;
Expand All@@ -34,8 +35,10 @@
import com.sucy.skill.api.util.ParticleHelper;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import java.util.ArrayList;
Expand DownExpand Up@@ -75,7 +78,12 @@ public class ParticleProjectile extends CustomProjectile
private int freq;
private int life;
private Vector gravity;
private boolean pierce;
private boolean pierce;
private Entity missileTarget;
private double missileThreshold;
private double missileAngle;
private double missileDelay;
private boolean missileStarted = false;

/**
* Constructor
Expand All@@ -96,10 +104,42 @@ public ParticleProjectile(LivingEntity shooter, int level, Location loc, Setting
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = null;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}
public ParticleProjectile(LivingEntity shooter, int level, Location loc, Settings settings, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
super(shooter);

this.loc = loc;
this.settings = settings;
this.vel = loc.getDirection().multiply(settings.getAttr(SPEED, level, 1.0));
this.freq = (int) (20 * settings.getDouble(FREQUENCY, 0.5));
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = missileTarget;
this.missileThreshold = missileThreshold;
this.missileAngle = missileAngle;
this.missileDelay = missileDelay;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
//Missile delay
if(missileDelay == 0){
missileStarted = true;
}else {
new BukkitRunnable() {

@Override
public void run() {
missileStarted = true;
}
}.runTaskLater(SkillAPI.singleton, Math.round(missileDelay * 20));
}
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}

Expand DownExpand Up@@ -224,6 +264,28 @@ public void run()
cancel();
Bukkit.getPluginManager().callEvent(new ParticleProjectileExpireEvent(this));
}

//Missile
if(missileTarget!=null && missileStarted){
final Vector vel = getVelocity();
final double speed = vel.length();
final Vector dir = vel.multiply(1 / speed);
final Vector towards = missileTarget.getLocation().toVector().subtract(getLocation().toVector());
final Vector targetDir = towards.normalize();
final double dot = dir.dot(targetDir);//degree of inaccurate
if (dot >= missileThreshold) {
setVelocity(targetDir.multiply(speed));
} else {
Vector currentDir = vel.normalize();
Vector sum = currentDir.add(targetDir);
Vector newDir = sum.divide(new Vector(2,2,2));
Vector normalizedNewDir = newDir.normalize();
setVelocity(normalizedNewDir.multiply(speed));
//final double m = Math.sin()
//baseProjectile.setVelocity(result);
}

}
}

/**
Expand All@@ -240,15 +302,15 @@ public void run()
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
ArrayList<Vector> dirs = calcSpread(center, angle, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Vector dir : dirs)
{
Location l = loc.clone();
l.setDirection(dir);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand All@@ -269,15 +331,15 @@ public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int lev
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
Vector vel = new Vector(0, 1, 0);
ArrayList<Location> locs = calcRain(center, radius, height, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Location l : locs)
{
l.setDirection(vel);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -291,5 +291,6 @@ private static void register(final EffectComponent component) {
register(new WarpTargetMechanic());
register(new WarpValueMechanic());
register(new WolfMechanic());
register(new SetGlowMechanic());
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,6 +40,7 @@
import com.sucy.skill.cast.IndicatorType;
import com.sucy.skill.cast.ProjectileIndicator;
import com.sucy.skill.dynamic.TempEntity;
import com.sucy.skill.dynamic.target.RememberTarget;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
Expand All@@ -66,6 +67,13 @@ public class ParticleProjectileMechanic extends MechanicComponent implements Pro
private static final String UPWARD = "upward";
private static final String FORWARD = "forward";

//Missile
private static final String MISSILE_TARGET = "missile_target";
private static final String MISSILE_THRESHOLD = "missile_threshold";
private static final String MISSILE_ANGLE = "missile_angle";
private static final String MISSILE_DELAY = "missile_delay";

//Effect
private static final String USE_EFFECT = "use-effect";
private static final String EFFECT_KEY = "effect-key";

Expand DownExpand Up@@ -144,6 +152,18 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy.set(ParticleProjectile.SPEED, parseValues(caster, ParticleProjectile.SPEED, level, 1), 0);
copy.set(ParticleHelper.PARTICLES_KEY, parseValues(caster, ParticleHelper.PARTICLES_KEY, level, 1), 0);
copy.set(ParticleHelper.RADIUS_KEY, parseValues(caster, ParticleHelper.RADIUS_KEY, level, 0), 0);
final List<LivingEntity> missileTargets = RememberTarget.remember(caster, settings.getString(MISSILE_TARGET, "_none"));

LivingEntity missileTarget = null;
double missileThreshold = 0;
double missileAngle = 0;
double missileDelay = 0;
if(missileTargets.size() > 0) {
missileTarget = missileTargets.get(0);
missileThreshold = settings.getDouble(MISSILE_THRESHOLD);
missileAngle = settings.getDouble(MISSILE_ANGLE);
missileDelay = settings.getDouble(MISSILE_DELAY);
}

// Fire from each target
for (LivingEntity target : targets) {
Expand All@@ -154,7 +174,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
if (spread.equals("rain")) {
double radius = parseValues(caster, RADIUS, level, 2.0);
double height = parseValues(caster, HEIGHT, level, 8.0);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this, missileTarget, missileThreshold, missileAngle, missileDelay);
} else {
Vector dir = target.getLocation().getDirection();

Expand All@@ -179,7 +199,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy,
angle,
amount,
this
this, missileTarget, missileThreshold, missileAngle, missileDelay
);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion editor/js/component.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -193,7 +193,8 @@ var Mechanic = {
WARP_SWAP: { name: 'Warp Swap', container: false, construct: MechanicWarpSwap },
WARP_TARGET: { name: 'Warp Target', container: false, construct: MechanicWarpTarget },
WARP_VALUE: { name: 'Warp Value', container: false, construct: MechanicWarpValue },
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf }
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf },
SET_GLOW: { name: 'Set Glow', container: false, construct: MechanicSetGlow }
};

var saveIndex;
Expand DownExpand Up@@ -2504,6 +2505,9 @@ function MechanicParticleProjectile()
.setTooltip('How long in seconds before the projectile will expire in case it doesn\'t hit anything')
);

//Add missile options (homing projectile)
addMissileOptions(this, true);

addEffectOptions(this, true);
}

Expand DownExpand Up@@ -3239,6 +3243,21 @@ function MechanicWolf()
);
}

extend('MechanicSetGlow', 'Component');
function MechanicSetGlow()
{
this.super('Set Glow', Type.MECHANIC, false);

this.description = 'glow target with color (only caster can see it)';

this.data.push(new ListValue('Glow Color', 'color', getGlowColors(), 'White')
.setTooltip('The color of glowing')
);
this.data.push(new AttributeValue('Duration', 'seconds', 10, 0)
.setTooltip('How long should it glow for')
);
}

// The active component being edited or added to
var activeComponent = undefined;

Expand DownExpand Up@@ -3391,7 +3410,29 @@ function addParticleOptions(component) {
component.data.push(new DoubleValue('Speed', 'speed', 0.1).setTooltip('Speed of the particle. For some particles controls other parameters, such as size.')
);
}
function addMissileOptions(component, optional)
{
var opt = appendNone;
if(optional){
opt = appendMissileOptional;
component.data.push(new ListValue('Use Missile', 'use-missile', [ 'True', 'False' ], 'False')
.setTooltip('Whether or not to use the missile (homing projectile)..')
);
}

component.data.push(opt(new StringValue('Missile Target', 'missile_target', "none")
.setTooltip('The target you would like to home at'))
);
component.data.push(opt(new DoubleValue('Missile Threshold', 'missile_threshold', 3)
.setTooltip('The threshold of the missile'))
);
component.data.push(opt(new DoubleValue('Missile Angle', 'missile_angle', 3)
.setTooltip('The angle of the missile will turn'))
);
component.data.push(opt(new DoubleValue('Missile Delay', 'missile_delay', 0)
.setTooltip('The delay before auto homing the target'))
);
}
function addEffectOptions(component, optional)
{
var opt = appendNone;
Expand DownExpand Up@@ -3469,6 +3510,11 @@ function appendOptional(value)
value.requireValue('use-effect', [ 'True' ]);
return value;
}
function appendMissileOptional(value)
{
value.requireValue('use-missile', [ 'True' ]);
return value;
}

function appendNone(value)
{
Expand Down
21 changes: 21 additions & 0 deletions editor/js/data/data.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -66,6 +66,9 @@ function getBadPotions() {
function getDyes() {
return DYES;
}
function getGlowColors(){
return GLOW_COLORS;
}

const GOOD_POTIONS = [
"Speed",
Expand DownExpand Up@@ -118,4 +121,22 @@ const DYES = [
'RED',
'WHITE',
'YELLOW'
];
const GLOW_COLORS = ['BLACK',
'DARK_BLUE',
'DARK_GREEN',
'DARK_AQUA',
'DARK_RED',
'DARK_PURPLE',
'GOLD',
'GRAY',
'DARK_GRAY',
'BLUE',
'GREEN',
'AQUA',
'RED',
'PURPLE',
'YELLOW',
'WHITE',
'NONE'
];
Binary file addedlib/GlowAPI_v1.4.6-SNAPSHOT.jar
Binary file not shown.
9 changes: 8 additions & 1 deletion pom.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -142,9 +142,16 @@
<dependency>
<groupId>LibsDisguises</groupId>
<artifactId>LibsDisguises</artifactId>
<version>10.0.19</version>
<version>10.0.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.InventivetalentDev</groupId>
<artifactId>GlowAPI</artifactId>
<version>1.4.6-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/lib/GlowAPI_v1.4.6-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/sucy/skill/SkillAPI.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,7 +74,7 @@
* <p>You can retrieve a reference to this through Bukkit the same way as any other plugin.</p>
*/
public class SkillAPI extends JavaPlugin {
private static SkillAPI singleton;
public static SkillAPI singleton;

private final HashMap<String, Skill> skills = new HashMap<>();
private final HashMap<String, RPGClass> classes = new HashMap<>();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@
*/
package com.sucy.skill.api.projectile;

import com.sucy.skill.SkillAPI;
import com.sucy.skill.api.Settings;
import com.sucy.skill.api.event.ParticleProjectileExpireEvent;
import com.sucy.skill.api.event.ParticleProjectileHitEvent;
Expand All@@ -34,8 +35,10 @@
import com.sucy.skill.api.util.ParticleHelper;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import java.util.ArrayList;
Expand DownExpand Up@@ -75,7 +78,12 @@ public class ParticleProjectile extends CustomProjectile
private int freq;
private int life;
private Vector gravity;
private boolean pierce;
private boolean pierce;
private Entity missileTarget;
private double missileThreshold;
private double missileAngle;
private double missileDelay;
private boolean missileStarted = false;

/**
* Constructor
Expand All@@ -96,10 +104,42 @@ public ParticleProjectile(LivingEntity shooter, int level, Location loc, Setting
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = null;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}
public ParticleProjectile(LivingEntity shooter, int level, Location loc, Settings settings, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
super(shooter);

this.loc = loc;
this.settings = settings;
this.vel = loc.getDirection().multiply(settings.getAttr(SPEED, level, 1.0));
this.freq = (int) (20 * settings.getDouble(FREQUENCY, 0.5));
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = missileTarget;
this.missileThreshold = missileThreshold;
this.missileAngle = missileAngle;
this.missileDelay = missileDelay;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
//Missile delay
if(missileDelay == 0){
missileStarted = true;
}else {
new BukkitRunnable() {

@Override
public void run() {
missileStarted = true;
}
}.runTaskLater(SkillAPI.singleton, Math.round(missileDelay * 20));
}
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}

Expand DownExpand Up@@ -224,6 +264,28 @@ public void run()
cancel();
Bukkit.getPluginManager().callEvent(new ParticleProjectileExpireEvent(this));
}

//Missile
if(missileTarget!=null && missileStarted){
final Vector vel = getVelocity();
final double speed = vel.length();
final Vector dir = vel.multiply(1 / speed);
final Vector towards = missileTarget.getLocation().toVector().subtract(getLocation().toVector());
final Vector targetDir = towards.normalize();
final double dot = dir.dot(targetDir);//degree of inaccurate
if (dot >= missileThreshold) {
setVelocity(targetDir.multiply(speed));
} else {
Vector currentDir = vel.normalize();
Vector sum = currentDir.add(targetDir);
Vector newDir = sum.divide(new Vector(2,2,2));
Vector normalizedNewDir = newDir.normalize();
setVelocity(normalizedNewDir.multiply(speed));
//final double m = Math.sin()
//baseProjectile.setVelocity(result);
}

}
}

/**
Expand All@@ -240,15 +302,15 @@ public void run()
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
ArrayList<Vector> dirs = calcSpread(center, angle, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Vector dir : dirs)
{
Location l = loc.clone();
l.setDirection(dir);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand All@@ -269,15 +331,15 @@ public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int lev
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
Vector vel = new Vector(0, 1, 0);
ArrayList<Location> locs = calcRain(center, radius, height, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Location l : locs)
{
l.setDirection(vel);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -291,5 +291,6 @@ private static void register(final EffectComponent component) {
register(new WarpTargetMechanic());
register(new WarpValueMechanic());
register(new WolfMechanic());
register(new SetGlowMechanic());
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,6 +40,7 @@
import com.sucy.skill.cast.IndicatorType;
import com.sucy.skill.cast.ProjectileIndicator;
import com.sucy.skill.dynamic.TempEntity;
import com.sucy.skill.dynamic.target.RememberTarget;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
Expand All@@ -66,6 +67,13 @@ public class ParticleProjectileMechanic extends MechanicComponent implements Pro
private static final String UPWARD = "upward";
private static final String FORWARD = "forward";

//Missile
private static final String MISSILE_TARGET = "missile_target";
private static final String MISSILE_THRESHOLD = "missile_threshold";
private static final String MISSILE_ANGLE = "missile_angle";
private static final String MISSILE_DELAY = "missile_delay";

//Effect
private static final String USE_EFFECT = "use-effect";
private static final String EFFECT_KEY = "effect-key";

Expand DownExpand Up@@ -144,6 +152,18 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy.set(ParticleProjectile.SPEED, parseValues(caster, ParticleProjectile.SPEED, level, 1), 0);
copy.set(ParticleHelper.PARTICLES_KEY, parseValues(caster, ParticleHelper.PARTICLES_KEY, level, 1), 0);
copy.set(ParticleHelper.RADIUS_KEY, parseValues(caster, ParticleHelper.RADIUS_KEY, level, 0), 0);
final List<LivingEntity> missileTargets = RememberTarget.remember(caster, settings.getString(MISSILE_TARGET, "_none"));

LivingEntity missileTarget = null;
double missileThreshold = 0;
double missileAngle = 0;
double missileDelay = 0;
if(missileTargets.size() > 0) {
missileTarget = missileTargets.get(0);
missileThreshold = settings.getDouble(MISSILE_THRESHOLD);
missileAngle = settings.getDouble(MISSILE_ANGLE);
missileDelay = settings.getDouble(MISSILE_DELAY);
}

// Fire from each target
for (LivingEntity target : targets) {
Expand All@@ -154,7 +174,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
if (spread.equals("rain")) {
double radius = parseValues(caster, RADIUS, level, 2.0);
double height = parseValues(caster, HEIGHT, level, 8.0);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this, missileTarget, missileThreshold, missileAngle, missileDelay);
} else {
Vector dir = target.getLocation().getDirection();

Expand All@@ -179,7 +199,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy,
angle,
amount,
this
this, missileTarget, missileThreshold, missileAngle, missileDelay
);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion editor/js/component.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -193,7 +193,8 @@ var Mechanic = {
WARP_SWAP: { name: 'Warp Swap', container: false, construct: MechanicWarpSwap },
WARP_TARGET: { name: 'Warp Target', container: false, construct: MechanicWarpTarget },
WARP_VALUE: { name: 'Warp Value', container: false, construct: MechanicWarpValue },
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf }
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf },
SET_GLOW: { name: 'Set Glow', container: false, construct: MechanicSetGlow }
};

var saveIndex;
Expand DownExpand Up@@ -2504,6 +2505,9 @@ function MechanicParticleProjectile()
.setTooltip('How long in seconds before the projectile will expire in case it doesn\'t hit anything')
);

//Add missile options (homing projectile)
addMissileOptions(this, true);

addEffectOptions(this, true);
}

Expand DownExpand Up@@ -3239,6 +3243,21 @@ function MechanicWolf()
);
}

extend('MechanicSetGlow', 'Component');
function MechanicSetGlow()
{
this.super('Set Glow', Type.MECHANIC, false);

this.description = 'glow target with color (only caster can see it)';

this.data.push(new ListValue('Glow Color', 'color', getGlowColors(), 'White')
.setTooltip('The color of glowing')
);
this.data.push(new AttributeValue('Duration', 'seconds', 10, 0)
.setTooltip('How long should it glow for')
);
}

// The active component being edited or added to
var activeComponent = undefined;

Expand DownExpand Up@@ -3391,7 +3410,29 @@ function addParticleOptions(component) {
component.data.push(new DoubleValue('Speed', 'speed', 0.1).setTooltip('Speed of the particle. For some particles controls other parameters, such as size.')
);
}
function addMissileOptions(component, optional)
{
var opt = appendNone;
if(optional){
opt = appendMissileOptional;
component.data.push(new ListValue('Use Missile', 'use-missile', [ 'True', 'False' ], 'False')
.setTooltip('Whether or not to use the missile (homing projectile)..')
);
}

component.data.push(opt(new StringValue('Missile Target', 'missile_target', "none")
.setTooltip('The target you would like to home at'))
);
component.data.push(opt(new DoubleValue('Missile Threshold', 'missile_threshold', 3)
.setTooltip('The threshold of the missile'))
);
component.data.push(opt(new DoubleValue('Missile Angle', 'missile_angle', 3)
.setTooltip('The angle of the missile will turn'))
);
component.data.push(opt(new DoubleValue('Missile Delay', 'missile_delay', 0)
.setTooltip('The delay before auto homing the target'))
);
}
function addEffectOptions(component, optional)
{
var opt = appendNone;
Expand DownExpand Up@@ -3469,6 +3510,11 @@ function appendOptional(value)
value.requireValue('use-effect', [ 'True' ]);
return value;
}
function appendMissileOptional(value)
{
value.requireValue('use-missile', [ 'True' ]);
return value;
}

function appendNone(value)
{
Expand Down
21 changes: 21 additions & 0 deletions editor/js/data/data.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -66,6 +66,9 @@ function getBadPotions() {
function getDyes() {
return DYES;
}
function getGlowColors(){
return GLOW_COLORS;
}

const GOOD_POTIONS = [
"Speed",
Expand DownExpand Up@@ -118,4 +121,22 @@ const DYES = [
'RED',
'WHITE',
'YELLOW'
];
const GLOW_COLORS = ['BLACK',
'DARK_BLUE',
'DARK_GREEN',
'DARK_AQUA',
'DARK_RED',
'DARK_PURPLE',
'GOLD',
'GRAY',
'DARK_GRAY',
'BLUE',
'GREEN',
'AQUA',
'RED',
'PURPLE',
'YELLOW',
'WHITE',
'NONE'
];
Binary file addedlib/GlowAPI_v1.4.6-SNAPSHOT.jar
Binary file not shown.
9 changes: 8 additions & 1 deletion pom.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -142,9 +142,16 @@
<dependency>
<groupId>LibsDisguises</groupId>
<artifactId>LibsDisguises</artifactId>
<version>10.0.19</version>
<version>10.0.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.InventivetalentDev</groupId>
<artifactId>GlowAPI</artifactId>
<version>1.4.6-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/lib/GlowAPI_v1.4.6-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/sucy/skill/SkillAPI.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,7 +74,7 @@
* <p>You can retrieve a reference to this through Bukkit the same way as any other plugin.</p>
*/
public class SkillAPI extends JavaPlugin {
private static SkillAPI singleton;
public static SkillAPI singleton;

private final HashMap<String, Skill> skills = new HashMap<>();
private final HashMap<String, RPGClass> classes = new HashMap<>();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@
*/
package com.sucy.skill.api.projectile;

import com.sucy.skill.SkillAPI;
import com.sucy.skill.api.Settings;
import com.sucy.skill.api.event.ParticleProjectileExpireEvent;
import com.sucy.skill.api.event.ParticleProjectileHitEvent;
Expand All@@ -34,8 +35,10 @@
import com.sucy.skill.api.util.ParticleHelper;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import java.util.ArrayList;
Expand DownExpand Up@@ -75,7 +78,12 @@ public class ParticleProjectile extends CustomProjectile
private int freq;
private int life;
private Vector gravity;
private boolean pierce;
private boolean pierce;
private Entity missileTarget;
private double missileThreshold;
private double missileAngle;
private double missileDelay;
private boolean missileStarted = false;

/**
* Constructor
Expand All@@ -96,10 +104,42 @@ public ParticleProjectile(LivingEntity shooter, int level, Location loc, Setting
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = null;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}
public ParticleProjectile(LivingEntity shooter, int level, Location loc, Settings settings, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
super(shooter);

this.loc = loc;
this.settings = settings;
this.vel = loc.getDirection().multiply(settings.getAttr(SPEED, level, 1.0));
this.freq = (int) (20 * settings.getDouble(FREQUENCY, 0.5));
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = missileTarget;
this.missileThreshold = missileThreshold;
this.missileAngle = missileAngle;
this.missileDelay = missileDelay;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
//Missile delay
if(missileDelay == 0){
missileStarted = true;
}else {
new BukkitRunnable() {

@Override
public void run() {
missileStarted = true;
}
}.runTaskLater(SkillAPI.singleton, Math.round(missileDelay * 20));
}
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}

Expand DownExpand Up@@ -224,6 +264,28 @@ public void run()
cancel();
Bukkit.getPluginManager().callEvent(new ParticleProjectileExpireEvent(this));
}

//Missile
if(missileTarget!=null && missileStarted){
final Vector vel = getVelocity();
final double speed = vel.length();
final Vector dir = vel.multiply(1 / speed);
final Vector towards = missileTarget.getLocation().toVector().subtract(getLocation().toVector());
final Vector targetDir = towards.normalize();
final double dot = dir.dot(targetDir);//degree of inaccurate
if (dot >= missileThreshold) {
setVelocity(targetDir.multiply(speed));
} else {
Vector currentDir = vel.normalize();
Vector sum = currentDir.add(targetDir);
Vector newDir = sum.divide(new Vector(2,2,2));
Vector normalizedNewDir = newDir.normalize();
setVelocity(normalizedNewDir.multiply(speed));
//final double m = Math.sin()
//baseProjectile.setVelocity(result);
}

}
}

/**
Expand All@@ -240,15 +302,15 @@ public void run()
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
ArrayList<Vector> dirs = calcSpread(center, angle, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Vector dir : dirs)
{
Location l = loc.clone();
l.setDirection(dir);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand All@@ -269,15 +331,15 @@ public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int lev
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
Vector vel = new Vector(0, 1, 0);
ArrayList<Location> locs = calcRain(center, radius, height, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Location l : locs)
{
l.setDirection(vel);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -291,5 +291,6 @@ private static void register(final EffectComponent component) {
register(new WarpTargetMechanic());
register(new WarpValueMechanic());
register(new WolfMechanic());
register(new SetGlowMechanic());
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,6 +40,7 @@
import com.sucy.skill.cast.IndicatorType;
import com.sucy.skill.cast.ProjectileIndicator;
import com.sucy.skill.dynamic.TempEntity;
import com.sucy.skill.dynamic.target.RememberTarget;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
Expand All@@ -66,6 +67,13 @@ public class ParticleProjectileMechanic extends MechanicComponent implements Pro
private static final String UPWARD = "upward";
private static final String FORWARD = "forward";

//Missile
private static final String MISSILE_TARGET = "missile_target";
private static final String MISSILE_THRESHOLD = "missile_threshold";
private static final String MISSILE_ANGLE = "missile_angle";
private static final String MISSILE_DELAY = "missile_delay";

//Effect
private static final String USE_EFFECT = "use-effect";
private static final String EFFECT_KEY = "effect-key";

Expand DownExpand Up@@ -144,6 +152,18 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy.set(ParticleProjectile.SPEED, parseValues(caster, ParticleProjectile.SPEED, level, 1), 0);
copy.set(ParticleHelper.PARTICLES_KEY, parseValues(caster, ParticleHelper.PARTICLES_KEY, level, 1), 0);
copy.set(ParticleHelper.RADIUS_KEY, parseValues(caster, ParticleHelper.RADIUS_KEY, level, 0), 0);
final List<LivingEntity> missileTargets = RememberTarget.remember(caster, settings.getString(MISSILE_TARGET, "_none"));

LivingEntity missileTarget = null;
double missileThreshold = 0;
double missileAngle = 0;
double missileDelay = 0;
if(missileTargets.size() > 0) {
missileTarget = missileTargets.get(0);
missileThreshold = settings.getDouble(MISSILE_THRESHOLD);
missileAngle = settings.getDouble(MISSILE_ANGLE);
missileDelay = settings.getDouble(MISSILE_DELAY);
}

// Fire from each target
for (LivingEntity target : targets) {
Expand All@@ -154,7 +174,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
if (spread.equals("rain")) {
double radius = parseValues(caster, RADIUS, level, 2.0);
double height = parseValues(caster, HEIGHT, level, 8.0);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this, missileTarget, missileThreshold, missileAngle, missileDelay);
} else {
Vector dir = target.getLocation().getDirection();

Expand All@@ -179,7 +199,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy,
angle,
amount,
this
this, missileTarget, missileThreshold, missileAngle, missileDelay
);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion editor/js/component.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -193,7 +193,8 @@ var Mechanic = {
WARP_SWAP: { name: 'Warp Swap', container: false, construct: MechanicWarpSwap },
WARP_TARGET: { name: 'Warp Target', container: false, construct: MechanicWarpTarget },
WARP_VALUE: { name: 'Warp Value', container: false, construct: MechanicWarpValue },
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf }
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf },
SET_GLOW: { name: 'Set Glow', container: false, construct: MechanicSetGlow }
};

var saveIndex;
Expand DownExpand Up@@ -2504,6 +2505,9 @@ function MechanicParticleProjectile()
.setTooltip('How long in seconds before the projectile will expire in case it doesn\'t hit anything')
);

//Add missile options (homing projectile)
addMissileOptions(this, true);

addEffectOptions(this, true);
}

Expand DownExpand Up@@ -3239,6 +3243,21 @@ function MechanicWolf()
);
}

extend('MechanicSetGlow', 'Component');
function MechanicSetGlow()
{
this.super('Set Glow', Type.MECHANIC, false);

this.description = 'glow target with color (only caster can see it)';

this.data.push(new ListValue('Glow Color', 'color', getGlowColors(), 'White')
.setTooltip('The color of glowing')
);
this.data.push(new AttributeValue('Duration', 'seconds', 10, 0)
.setTooltip('How long should it glow for')
);
}

// The active component being edited or added to
var activeComponent = undefined;

Expand DownExpand Up@@ -3391,7 +3410,29 @@ function addParticleOptions(component) {
component.data.push(new DoubleValue('Speed', 'speed', 0.1).setTooltip('Speed of the particle. For some particles controls other parameters, such as size.')
);
}
function addMissileOptions(component, optional)
{
var opt = appendNone;
if(optional){
opt = appendMissileOptional;
component.data.push(new ListValue('Use Missile', 'use-missile', [ 'True', 'False' ], 'False')
.setTooltip('Whether or not to use the missile (homing projectile)..')
);
}

component.data.push(opt(new StringValue('Missile Target', 'missile_target', "none")
.setTooltip('The target you would like to home at'))
);
component.data.push(opt(new DoubleValue('Missile Threshold', 'missile_threshold', 3)
.setTooltip('The threshold of the missile'))
);
component.data.push(opt(new DoubleValue('Missile Angle', 'missile_angle', 3)
.setTooltip('The angle of the missile will turn'))
);
component.data.push(opt(new DoubleValue('Missile Delay', 'missile_delay', 0)
.setTooltip('The delay before auto homing the target'))
);
}
function addEffectOptions(component, optional)
{
var opt = appendNone;
Expand DownExpand Up@@ -3469,6 +3510,11 @@ function appendOptional(value)
value.requireValue('use-effect', [ 'True' ]);
return value;
}
function appendMissileOptional(value)
{
value.requireValue('use-missile', [ 'True' ]);
return value;
}

function appendNone(value)
{
Expand Down
21 changes: 21 additions & 0 deletions editor/js/data/data.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -66,6 +66,9 @@ function getBadPotions() {
function getDyes() {
return DYES;
}
function getGlowColors(){
return GLOW_COLORS;
}

const GOOD_POTIONS = [
"Speed",
Expand DownExpand Up@@ -118,4 +121,22 @@ const DYES = [
'RED',
'WHITE',
'YELLOW'
];
const GLOW_COLORS = ['BLACK',
'DARK_BLUE',
'DARK_GREEN',
'DARK_AQUA',
'DARK_RED',
'DARK_PURPLE',
'GOLD',
'GRAY',
'DARK_GRAY',
'BLUE',
'GREEN',
'AQUA',
'RED',
'PURPLE',
'YELLOW',
'WHITE',
'NONE'
];
Binary file addedlib/GlowAPI_v1.4.6-SNAPSHOT.jar
Binary file not shown.
9 changes: 8 additions & 1 deletion pom.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -142,9 +142,16 @@
<dependency>
<groupId>LibsDisguises</groupId>
<artifactId>LibsDisguises</artifactId>
<version>10.0.19</version>
<version>10.0.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.InventivetalentDev</groupId>
<artifactId>GlowAPI</artifactId>
<version>1.4.6-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/lib/GlowAPI_v1.4.6-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/sucy/skill/SkillAPI.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,7 +74,7 @@
* <p>You can retrieve a reference to this through Bukkit the same way as any other plugin.</p>
*/
public class SkillAPI extends JavaPlugin {
private static SkillAPI singleton;
public static SkillAPI singleton;

private final HashMap<String, Skill> skills = new HashMap<>();
private final HashMap<String, RPGClass> classes = new HashMap<>();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@
*/
package com.sucy.skill.api.projectile;

import com.sucy.skill.SkillAPI;
import com.sucy.skill.api.Settings;
import com.sucy.skill.api.event.ParticleProjectileExpireEvent;
import com.sucy.skill.api.event.ParticleProjectileHitEvent;
Expand All@@ -34,8 +35,10 @@
import com.sucy.skill.api.util.ParticleHelper;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import java.util.ArrayList;
Expand DownExpand Up@@ -75,7 +78,12 @@ public class ParticleProjectile extends CustomProjectile
private int freq;
private int life;
private Vector gravity;
private boolean pierce;
private boolean pierce;
private Entity missileTarget;
private double missileThreshold;
private double missileAngle;
private double missileDelay;
private boolean missileStarted = false;

/**
* Constructor
Expand All@@ -96,10 +104,42 @@ public ParticleProjectile(LivingEntity shooter, int level, Location loc, Setting
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = null;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}
public ParticleProjectile(LivingEntity shooter, int level, Location loc, Settings settings, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
super(shooter);

this.loc = loc;
this.settings = settings;
this.vel = loc.getDirection().multiply(settings.getAttr(SPEED, level, 1.0));
this.freq = (int) (20 * settings.getDouble(FREQUENCY, 0.5));
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = missileTarget;
this.missileThreshold = missileThreshold;
this.missileAngle = missileAngle;
this.missileDelay = missileDelay;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
//Missile delay
if(missileDelay == 0){
missileStarted = true;
}else {
new BukkitRunnable() {

@Override
public void run() {
missileStarted = true;
}
}.runTaskLater(SkillAPI.singleton, Math.round(missileDelay * 20));
}
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}

Expand DownExpand Up@@ -224,6 +264,28 @@ public void run()
cancel();
Bukkit.getPluginManager().callEvent(new ParticleProjectileExpireEvent(this));
}

//Missile
if(missileTarget!=null && missileStarted){
final Vector vel = getVelocity();
final double speed = vel.length();
final Vector dir = vel.multiply(1 / speed);
final Vector towards = missileTarget.getLocation().toVector().subtract(getLocation().toVector());
final Vector targetDir = towards.normalize();
final double dot = dir.dot(targetDir);//degree of inaccurate
if (dot >= missileThreshold) {
setVelocity(targetDir.multiply(speed));
} else {
Vector currentDir = vel.normalize();
Vector sum = currentDir.add(targetDir);
Vector newDir = sum.divide(new Vector(2,2,2));
Vector normalizedNewDir = newDir.normalize();
setVelocity(normalizedNewDir.multiply(speed));
//final double m = Math.sin()
//baseProjectile.setVelocity(result);
}

}
}

/**
Expand All@@ -240,15 +302,15 @@ public void run()
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
ArrayList<Vector> dirs = calcSpread(center, angle, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Vector dir : dirs)
{
Location l = loc.clone();
l.setDirection(dir);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand All@@ -269,15 +331,15 @@ public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int lev
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
Vector vel = new Vector(0, 1, 0);
ArrayList<Location> locs = calcRain(center, radius, height, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Location l : locs)
{
l.setDirection(vel);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -291,5 +291,6 @@ private static void register(final EffectComponent component) {
register(new WarpTargetMechanic());
register(new WarpValueMechanic());
register(new WolfMechanic());
register(new SetGlowMechanic());
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,6 +40,7 @@
import com.sucy.skill.cast.IndicatorType;
import com.sucy.skill.cast.ProjectileIndicator;
import com.sucy.skill.dynamic.TempEntity;
import com.sucy.skill.dynamic.target.RememberTarget;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
Expand All@@ -66,6 +67,13 @@ public class ParticleProjectileMechanic extends MechanicComponent implements Pro
private static final String UPWARD = "upward";
private static final String FORWARD = "forward";

//Missile
private static final String MISSILE_TARGET = "missile_target";
private static final String MISSILE_THRESHOLD = "missile_threshold";
private static final String MISSILE_ANGLE = "missile_angle";
private static final String MISSILE_DELAY = "missile_delay";

//Effect
private static final String USE_EFFECT = "use-effect";
private static final String EFFECT_KEY = "effect-key";

Expand DownExpand Up@@ -144,6 +152,18 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy.set(ParticleProjectile.SPEED, parseValues(caster, ParticleProjectile.SPEED, level, 1), 0);
copy.set(ParticleHelper.PARTICLES_KEY, parseValues(caster, ParticleHelper.PARTICLES_KEY, level, 1), 0);
copy.set(ParticleHelper.RADIUS_KEY, parseValues(caster, ParticleHelper.RADIUS_KEY, level, 0), 0);
final List<LivingEntity> missileTargets = RememberTarget.remember(caster, settings.getString(MISSILE_TARGET, "_none"));

LivingEntity missileTarget = null;
double missileThreshold = 0;
double missileAngle = 0;
double missileDelay = 0;
if(missileTargets.size() > 0) {
missileTarget = missileTargets.get(0);
missileThreshold = settings.getDouble(MISSILE_THRESHOLD);
missileAngle = settings.getDouble(MISSILE_ANGLE);
missileDelay = settings.getDouble(MISSILE_DELAY);
}

// Fire from each target
for (LivingEntity target : targets) {
Expand All@@ -154,7 +174,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
if (spread.equals("rain")) {
double radius = parseValues(caster, RADIUS, level, 2.0);
double height = parseValues(caster, HEIGHT, level, 8.0);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this, missileTarget, missileThreshold, missileAngle, missileDelay);
} else {
Vector dir = target.getLocation().getDirection();

Expand All@@ -179,7 +199,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy,
angle,
amount,
this
this, missileTarget, missileThreshold, missileAngle, missileDelay
);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion editor/js/component.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -193,7 +193,8 @@ var Mechanic = {
WARP_SWAP: { name: 'Warp Swap', container: false, construct: MechanicWarpSwap },
WARP_TARGET: { name: 'Warp Target', container: false, construct: MechanicWarpTarget },
WARP_VALUE: { name: 'Warp Value', container: false, construct: MechanicWarpValue },
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf }
WOLF: { name: 'Wolf', container: true, construct: MechanicWolf },
SET_GLOW: { name: 'Set Glow', container: false, construct: MechanicSetGlow }
};

var saveIndex;
Expand DownExpand Up@@ -2504,6 +2505,9 @@ function MechanicParticleProjectile()
.setTooltip('How long in seconds before the projectile will expire in case it doesn\'t hit anything')
);

//Add missile options (homing projectile)
addMissileOptions(this, true);

addEffectOptions(this, true);
}

Expand DownExpand Up@@ -3239,6 +3243,21 @@ function MechanicWolf()
);
}

extend('MechanicSetGlow', 'Component');
function MechanicSetGlow()
{
this.super('Set Glow', Type.MECHANIC, false);

this.description = 'glow target with color (only caster can see it)';

this.data.push(new ListValue('Glow Color', 'color', getGlowColors(), 'White')
.setTooltip('The color of glowing')
);
this.data.push(new AttributeValue('Duration', 'seconds', 10, 0)
.setTooltip('How long should it glow for')
);
}

// The active component being edited or added to
var activeComponent = undefined;

Expand DownExpand Up@@ -3391,7 +3410,29 @@ function addParticleOptions(component) {
component.data.push(new DoubleValue('Speed', 'speed', 0.1).setTooltip('Speed of the particle. For some particles controls other parameters, such as size.')
);
}
function addMissileOptions(component, optional)
{
var opt = appendNone;
if(optional){
opt = appendMissileOptional;
component.data.push(new ListValue('Use Missile', 'use-missile', [ 'True', 'False' ], 'False')
.setTooltip('Whether or not to use the missile (homing projectile)..')
);
}

component.data.push(opt(new StringValue('Missile Target', 'missile_target', "none")
.setTooltip('The target you would like to home at'))
);
component.data.push(opt(new DoubleValue('Missile Threshold', 'missile_threshold', 3)
.setTooltip('The threshold of the missile'))
);
component.data.push(opt(new DoubleValue('Missile Angle', 'missile_angle', 3)
.setTooltip('The angle of the missile will turn'))
);
component.data.push(opt(new DoubleValue('Missile Delay', 'missile_delay', 0)
.setTooltip('The delay before auto homing the target'))
);
}
function addEffectOptions(component, optional)
{
var opt = appendNone;
Expand DownExpand Up@@ -3469,6 +3510,11 @@ function appendOptional(value)
value.requireValue('use-effect', [ 'True' ]);
return value;
}
function appendMissileOptional(value)
{
value.requireValue('use-missile', [ 'True' ]);
return value;
}

function appendNone(value)
{
Expand Down
21 changes: 21 additions & 0 deletions editor/js/data/data.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -66,6 +66,9 @@ function getBadPotions() {
function getDyes() {
return DYES;
}
function getGlowColors(){
return GLOW_COLORS;
}

const GOOD_POTIONS = [
"Speed",
Expand DownExpand Up@@ -118,4 +121,22 @@ const DYES = [
'RED',
'WHITE',
'YELLOW'
];
const GLOW_COLORS = ['BLACK',
'DARK_BLUE',
'DARK_GREEN',
'DARK_AQUA',
'DARK_RED',
'DARK_PURPLE',
'GOLD',
'GRAY',
'DARK_GRAY',
'BLUE',
'GREEN',
'AQUA',
'RED',
'PURPLE',
'YELLOW',
'WHITE',
'NONE'
];
Binary file addedlib/GlowAPI_v1.4.6-SNAPSHOT.jar
Binary file not shown.
9 changes: 8 additions & 1 deletion pom.xml
Original file line numberDiff line numberDiff line change
Expand Up@@ -142,9 +142,16 @@
<dependency>
<groupId>LibsDisguises</groupId>
<artifactId>LibsDisguises</artifactId>
<version>10.0.19</version>
<version>10.0.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.InventivetalentDev</groupId>
<artifactId>GlowAPI</artifactId>
<version>1.4.6-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/lib/GlowAPI_v1.4.6-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/sucy/skill/SkillAPI.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -74,7 +74,7 @@
* <p>You can retrieve a reference to this through Bukkit the same way as any other plugin.</p>
*/
public class SkillAPI extends JavaPlugin {
private static SkillAPI singleton;
public static SkillAPI singleton;

private final HashMap<String, Skill> skills = new HashMap<>();
private final HashMap<String, RPGClass> classes = new HashMap<>();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@
*/
package com.sucy.skill.api.projectile;

import com.sucy.skill.SkillAPI;
import com.sucy.skill.api.Settings;
import com.sucy.skill.api.event.ParticleProjectileExpireEvent;
import com.sucy.skill.api.event.ParticleProjectileHitEvent;
Expand All@@ -34,8 +35,10 @@
import com.sucy.skill.api.util.ParticleHelper;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import java.util.ArrayList;
Expand DownExpand Up@@ -75,7 +78,12 @@ public class ParticleProjectile extends CustomProjectile
private int freq;
private int life;
private Vector gravity;
private boolean pierce;
private boolean pierce;
private Entity missileTarget;
private double missileThreshold;
private double missileAngle;
private double missileDelay;
private boolean missileStarted = false;

/**
* Constructor
Expand All@@ -96,10 +104,42 @@ public ParticleProjectile(LivingEntity shooter, int level, Location loc, Setting
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = null;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}
public ParticleProjectile(LivingEntity shooter, int level, Location loc, Settings settings, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
super(shooter);

this.loc = loc;
this.settings = settings;
this.vel = loc.getDirection().multiply(settings.getAttr(SPEED, level, 1.0));
this.freq = (int) (20 * settings.getDouble(FREQUENCY, 0.5));
this.life = (int) (settings.getDouble(LIFESPAN, 2) * 20);
this.gravity = new Vector(0, settings.getDouble(GRAVITY, 0), 0);
this.pierce = settings.getBool(PIERCE, false);
this.missileTarget = missileTarget;
this.missileThreshold = missileThreshold;
this.missileAngle = missileAngle;
this.missileDelay = missileDelay;
steps = (int) Math.ceil(vel.length() * 2);
vel.multiply(1.0 / steps);
gravity.multiply(1.0 / steps);
//Missile delay
if(missileDelay == 0){
missileStarted = true;
}else {
new BukkitRunnable() {

@Override
public void run() {
missileStarted = true;
}
}.runTaskLater(SkillAPI.singleton, Math.round(missileDelay * 20));
}
Bukkit.getPluginManager().callEvent(new ParticleProjectileLaunchEvent(this));
}

Expand DownExpand Up@@ -224,6 +264,28 @@ public void run()
cancel();
Bukkit.getPluginManager().callEvent(new ParticleProjectileExpireEvent(this));
}

//Missile
if(missileTarget!=null && missileStarted){
final Vector vel = getVelocity();
final double speed = vel.length();
final Vector dir = vel.multiply(1 / speed);
final Vector towards = missileTarget.getLocation().toVector().subtract(getLocation().toVector());
final Vector targetDir = towards.normalize();
final double dot = dir.dot(targetDir);//degree of inaccurate
if (dot >= missileThreshold) {
setVelocity(targetDir.multiply(speed));
} else {
Vector currentDir = vel.normalize();
Vector sum = currentDir.add(targetDir);
Vector newDir = sum.divide(new Vector(2,2,2));
Vector normalizedNewDir = newDir.normalize();
setVelocity(normalizedNewDir.multiply(speed));
//final double m = Math.sin()
//baseProjectile.setVelocity(result);
}

}
}

/**
Expand All@@ -240,15 +302,15 @@ public void run()
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int level, Vector center, Location loc, Settings settings, double angle, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
ArrayList<Vector> dirs = calcSpread(center, angle, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Vector dir : dirs)
{
Location l = loc.clone();
l.setDirection(dir);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand All@@ -269,15 +331,15 @@ public static ArrayList<ParticleProjectile> spread(LivingEntity shooter, int lev
*
* @return list of fired projectiles
*/
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback)
public static ArrayList<ParticleProjectile> rain(LivingEntity shooter, int level, Location center, Settings settings, double radius, double height, int amount, ProjectileCallback callback, Entity missileTarget, double missileThreshold, double missileAngle, double missileDelay)
{
Vector vel = new Vector(0, 1, 0);
ArrayList<Location> locs = calcRain(center, radius, height, amount);
ArrayList<ParticleProjectile> list = new ArrayList<ParticleProjectile>();
for (Location l : locs)
{
l.setDirection(vel);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings);
ParticleProjectile p = new ParticleProjectile(shooter, level, l, settings, missileTarget, missileThreshold, missileAngle, missileDelay);
p.setCallback(callback);
list.add(p);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -291,5 +291,6 @@ private static void register(final EffectComponent component) {
register(new WarpTargetMechanic());
register(new WarpValueMechanic());
register(new WolfMechanic());
register(new SetGlowMechanic());
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,6 +40,7 @@
import com.sucy.skill.cast.IndicatorType;
import com.sucy.skill.cast.ProjectileIndicator;
import com.sucy.skill.dynamic.TempEntity;
import com.sucy.skill.dynamic.target.RememberTarget;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
Expand All@@ -66,6 +67,13 @@ public class ParticleProjectileMechanic extends MechanicComponent implements Pro
private static final String UPWARD = "upward";
private static final String FORWARD = "forward";

//Missile
private static final String MISSILE_TARGET = "missile_target";
private static final String MISSILE_THRESHOLD = "missile_threshold";
private static final String MISSILE_ANGLE = "missile_angle";
private static final String MISSILE_DELAY = "missile_delay";

//Effect
private static final String USE_EFFECT = "use-effect";
private static final String EFFECT_KEY = "effect-key";

Expand DownExpand Up@@ -144,6 +152,18 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy.set(ParticleProjectile.SPEED, parseValues(caster, ParticleProjectile.SPEED, level, 1), 0);
copy.set(ParticleHelper.PARTICLES_KEY, parseValues(caster, ParticleHelper.PARTICLES_KEY, level, 1), 0);
copy.set(ParticleHelper.RADIUS_KEY, parseValues(caster, ParticleHelper.RADIUS_KEY, level, 0), 0);
final List<LivingEntity> missileTargets = RememberTarget.remember(caster, settings.getString(MISSILE_TARGET, "_none"));

LivingEntity missileTarget = null;
double missileThreshold = 0;
double missileAngle = 0;
double missileDelay = 0;
if(missileTargets.size() > 0) {
missileTarget = missileTargets.get(0);
missileThreshold = settings.getDouble(MISSILE_THRESHOLD);
missileAngle = settings.getDouble(MISSILE_ANGLE);
missileDelay = settings.getDouble(MISSILE_DELAY);
}

// Fire from each target
for (LivingEntity target : targets) {
Expand All@@ -154,7 +174,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
if (spread.equals("rain")) {
double radius = parseValues(caster, RADIUS, level, 2.0);
double height = parseValues(caster, HEIGHT, level, 8.0);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this);
list = ParticleProjectile.rain(caster, level, loc, copy, radius, height, amount, this, missileTarget, missileThreshold, missileAngle, missileDelay);
} else {
Vector dir = target.getLocation().getDirection();

Expand All@@ -179,7 +199,7 @@ public boolean execute(LivingEntity caster, int level, List<LivingEntity> target
copy,
angle,
amount,
this
this, missileTarget, missileThreshold, missileAngle, missileDelay
);
}

Expand Down
Loading