Package ch.njol.skript.effects

Source Code of ch.njol.skript.effects.EffVehicle

/*
*   This file is part of Skript.
*
*  Skript is free software: you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation, either version 3 of the License, or
*  (at your option) any later version.
*
*  Skript is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with Skript.  If not, see <http://www.gnu.org/licenses/>.
*
*
* Copyright 2011, 2012 Peter Güttinger
*
*/

package ch.njol.skript.effects;

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

import ch.njol.skript.Skript;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.entity.EntityData;
import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.util.Kleenean;
import ch.njol.util.coll.CollectionUtils;

/**
* @author Peter Güttinger
*/
@Name("Vehicle")
@Description({"Makes an entity ride another entity, e.g. a minecart, a saddled pig, an arrow, etc."})
@Examples({"make the player ride a saddled pig",
    "make the attacker ride the victim"})
@Since("2.0")
public class EffVehicle extends Effect {
  static {
    Skript.registerEffect(EffVehicle.class,
        "(make|let|force) %entities% [to] (ride|mount) [(in|on)] %entity/entitydatas%",
        "(make|let|force) %entities% [to] (dismount|(dismount|leave) (from|of|) (any|the[ir]|his|her|) vehicle[s])",
        "(eject|dismount) (any|the|) passenger[s] (of|from) %entities%");
  }
 
  @Nullable
  private Expression<Entity> passengers;
  @Nullable
  private Expression<?> vehicles;
 
  @SuppressWarnings({"unchecked", "null"})
  @Override
  public boolean init(final Expression<?>[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) {
    passengers = matchedPattern == 2 ? null : (Expression<Entity>) exprs[0];
    vehicles = matchedPattern == 1 ? null : exprs[exprs.length - 1];
    if (passengers != null && vehicles != null && !passengers.isSingle() && vehicles.isSingle() && Entity.class.isAssignableFrom(vehicles.getReturnType()))
      Skript.warning("An entity can only have one passenger");
    return true;
  }
 
  @Override
  protected void execute(final Event e) {
    final Expression<?> vehicles = this.vehicles;
    final Expression<Entity> passengers = this.passengers;
    if (vehicles == null) {
      assert passengers != null;
      for (final Entity p : passengers.getArray(e))
        p.leaveVehicle();
      return;
    }
    if (passengers == null) {
      assert vehicles != null;
      for (final Object v : vehicles.getArray(e))
        ((Entity) v).eject();
      return;
    }
    final Object[] vs = vehicles.getArray(e);
    if (vs.length == 0)
      return;
    final Entity[] ps = passengers.getArray(e);
    if (ps.length == 0)
      return;
    for (final Object v : vs) {
      if (v instanceof Entity) {
        ((Entity) v).eject();
        final Entity p = CollectionUtils.getRandom(ps);
        assert p != null;
        p.leaveVehicle();
        ((Entity) v).setPassenger(p);
      } else {
        for (final Entity p : ps) {
          assert p != null : passengers;
          @SuppressWarnings("null")
          final Entity en = ((EntityData<?>) v).spawn(p.getLocation());
          if (en == null)
            return;
          en.setPassenger(p);
        }
      }
    }
  }
 
  @Override
  public String toString(final @Nullable Event e, final boolean debug) {
    final Expression<?> vehicles = this.vehicles;
    final Expression<Entity> passengers = this.passengers;
    if (vehicles == null) {
      assert passengers != null;
      return "make " + passengers.toString(e, debug) + " dismount";
    }
    if (passengers == null) {
      assert vehicles != null;
      return "eject passenger" + (vehicles.isSingle() ? "" : "s") + " of " + vehicles.toString(e, debug);
    }
    return "make " + passengers.toString(e, debug) + " ride " + vehicles.toString(e, debug);
  }
 
}
TOP

Related Classes of ch.njol.skript.effects.EffVehicle

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.