Package com.bergerkiller.bukkit.common.entity.nms

Source Code of com.bergerkiller.bukkit.common.entity.nms.NMSEntityHookImpl

package com.bergerkiller.bukkit.common.entity.nms;

import org.bukkit.Location;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.util.Vector;

import net.minecraft.server.DamageSource;
import net.minecraft.server.Entity;
import net.minecraft.server.EntityHuman;
import net.minecraft.server.NBTTagCompound;

import com.bergerkiller.bukkit.common.controller.DefaultEntityController;
import com.bergerkiller.bukkit.common.controller.EntityController;
import com.bergerkiller.bukkit.common.entity.CommonEntity;
import com.bergerkiller.bukkit.common.internal.CommonNMS;
import com.bergerkiller.bukkit.common.reflection.classes.EntityTypesRef;

public class NMSEntityHookImpl implements NMSEntityHook {
  private EntityController<?> controller;

  public NMSEntityHookImpl(CommonEntity<?> entity) {
    this.controller = new DefaultEntityController();
    this.controller.bind(entity);
  }

  @Override
  public EntityController<?> getController() {
    return this.controller;
  }

  @Override
  public void setController(EntityController<?> controller) {
    this.controller = controller;
  }

  @Override
  public boolean c(EntityHuman human) {
    return controller.onInteractBy(CommonNMS.getHuman(human));
  }

  @Override
  public void h() {
    controller.onTick();
  }

  @Override
  public boolean damageEntity(DamageSource damageSource, float damage) {
    controller.onDamage(com.bergerkiller.bukkit.common.wrappers.DamageSource.getForHandle(damageSource), damage);
    return true;
  }

  @Override
  public void burn(float damage) {
    controller.onBurnDamage(damage);
  }
 
  @Override
  public void g(double dx, double dy, double dz) {
    controller.onPush(dx, dy, dz);
  }

  @Override
  public void move(double dx, double dy, double dz) {
    controller.onMove(dx, dy, dz);
  }

  @Override
  public void die() {
    controller.onDie();
  }

  @Override
  public String getName() {
    return controller.getLocalizedName();
  }

  private String getSavedName() {
    return EntityTypesRef.classToNames.get(controller.getEntity().getHandle().getClass().getSuperclass());
  }

  @Override
  public boolean c(NBTTagCompound nbttagcompound) {
    if (this.controller.getEntity().isDead()) {
      return false;
    } else {
      nbttagcompound.setString("id", getSavedName());
      this.controller.getEntity().getHandle(Entity.class).e(nbttagcompound);
      return true;
    }
  }

  @Override
  public boolean d(NBTTagCompound nbttagcompound) {
    if (this.controller.getEntity().isDead() || (this.controller.getEntity().hasPlayerPassenger() && controller.isPlayerTakable())) {
      return false;
    } else {
      nbttagcompound.setString("id", getSavedName());
      this.controller.getEntity().getHandle(Entity.class).e(nbttagcompound);
      return true;
    }
  }

  @Override
  public void teleportTo(Location exit, boolean portal) {
    // Instead of using the default internal logic, we are better than that!
    // Let's bring forth our very own teleport logic!

    // Adjust the exit if the portal travel agent is being used
    CommonEntity<?> entity = this.controller.getEntity();
    if (portal) {
      Vector velocity = entity.getVelocity();
      CommonNMS.getNative(exit.getWorld()).getTravelAgent().adjustExit(entity.getHandle(Entity.class), exit, velocity);
      if (entity.vel.getX() != velocity.getX() || entity.vel.getY() != velocity.getY() || entity.vel.getZ() != velocity.getZ()) {
        entity.setVelocity(velocity);
      }
    }
    // Finally, teleport it
    this.controller.getEntity().teleport(exit, portal ? TeleportCause.NETHER_PORTAL : TeleportCause.UNKNOWN);
  }

  /*
   * The super methods are unused
   */
  @Override
  public boolean super_c(EntityHuman human) {
    return controller.getEntity().getHandle(NMSEntityHook.class).super_c(human);
  }

  @Override
  public void super_h() {
    controller.getEntity().getHandle(NMSEntityHook.class).super_h();
  }

  @Override
  public boolean super_damageEntity(DamageSource damagesource, float damage) {
    return controller.getEntity().getHandle(NMSEntityHook.class).super_damageEntity(damagesource, damage);
  }

  @Override
  public void super_burn(float damage) {
    controller.getEntity().getHandle(NMSEntityHook.class).super_burn(damage);
  }
 
  @Override
  public void super_g(double dx, double dy, double dz) {
    controller.getEntity().getHandle(NMSEntityHook.class).super_g(dx, dy, dz);
  }

  @Override
  public void super_move(double dx, double dy, double dz) {
    controller.getEntity().getHandle(NMSEntityHook.class).super_move(dx, dy, dz);
  }

  @Override
  public void super_die() {
    controller.getEntity().getHandle(NMSEntityHook.class).super_die();
  }

  @Override
  public String super_getName() {
    return controller.getEntity().getHandle(NMSEntityHook.class).super_getName();
  }

  @Override
  public void super_teleportTo(Location exit, boolean portal) {
    controller.getEntity().getHandle(NMSEntityHook.class).super_teleportTo(exit, portal) ;
  }
}
TOP

Related Classes of com.bergerkiller.bukkit.common.entity.nms.NMSEntityHookImpl

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.