Solved How to register an new effect!

  • Welcome to skUnity!

    Welcome to skUnity! This is a forum where members of the Skript community can communicate and interact. Skript Resource Creators can post their Resources for all to see and use.

    If you haven't done so already, feel free to join our official Discord server to expand your level of interaction with the comminuty!

    Now, what are you waiting for? Join the community now!

FilipeNock

Member
Jan 26, 2017
77
7
3
24
Brazil
www.youtube.com
Example:
Java:
    public void Sound(String s, Player p) {
        p.playSound(p.getLocation(), Sound.valueOf(s), 1, 1);
    
    }

code_language.skript:
Skript.registerEffect(TestSound.class, "play test [sound] %string% to %player%");

I really do not understand how to do this! And I've been looking for something else I could not understand

Someone is opposed to helping me?
Please, I'm asking for help so I beg you not to insult me

EDIT: Attempts
Java:
package me.filipenock.ponte;

import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.eclipse.jdt.annotation.Nullable;

import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.util.Kleenean;

public class TestSound extends Effect{
  
    private Expression<String> sound;
    private Expression<Player> player;

    @SuppressWarnings("unchecked")
    @Override
    public boolean init(Expression<?>[] var, int arg1, Kleenean param, ParseResult ParseResult) {
        this.sound = (Expression<String>) var[0];
        this.player = (Expression<Player>) var[1];
        return true;
    }

    @Override
    public String toString(@Nullable Event arg0, boolean arg1) {
        return null;
    }

    @Override
    protected void execute(Event e) {
        ((Player) player).playSound(((Player)this.player.getSingle(e)).getLocation(), Sound.valueOf(((String)this.sound.getSingle(e))), 1, 1);
      
    }

}
Result:
code_language.skript:
java.lang.ClassCastException: ch.njol.skript.expressions.ExprEntity cannot be cast to org.bukkit.entity.Player
 
Last edited:
To get the value of an expression, use Expression#getSingle(Event) or Expression#getAll(Event) instead of casting. Note, getSingle may return null, so you should return early if the expression may not be null.
Java:
public class TestSound extends Effect {
  static {
    Skript.registerEffect(TestSound.class, "play test [sound] %string% to %player%");
  }
 
  private Expression<String> sound;
  private Expression<Player> player;

  @Override
  protected void execute(Event e) {
    String s = sound.getSingle(e);
    Player p = player.getSingle(e);
   
    if (s == null || p == null) {
      return null;
    }

    // do whatever
  }

  @Override
  public String toString(@Nullable Event e, boolean debug) {
    return "this string is displayed for debug purposes; you should change it!";
  }

  @SuppressWarnings("unchecked")
  @Override
  public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
    sound = (Expression<String>) exprs[0];
    player = (Expression<Player>) exprs[1];
    return true;
  }
}
Since it looks like you're a new developer, you should read the Skript Addon Best Practices and check out the source code of other addons for examples.
 
  • Like
Reactions: FilipeNock