Package com.bergerkiller.bukkit.tc.signactions.detector

Source Code of com.bergerkiller.bukkit.tc.signactions.detector.DetectorSign

package com.bergerkiller.bukkit.tc.signactions.detector;

import org.bukkit.World;
import org.bukkit.block.Block;

import com.bergerkiller.bukkit.common.bases.IntVector3;
import com.bergerkiller.bukkit.tc.controller.MinecartGroup;
import com.bergerkiller.bukkit.tc.controller.MinecartMember;
import com.bergerkiller.bukkit.tc.detector.DetectorRegion;
import com.bergerkiller.bukkit.tc.events.SignActionEvent;
import com.bergerkiller.bukkit.tc.signactions.SignActionDetector;
import com.bergerkiller.bukkit.tc.statements.Statement;
import com.bergerkiller.bukkit.tc.storage.OfflineSign;

public class DetectorSign extends OfflineSign {

  public DetectorSign(DetectorSignPair detector, Block signBlock) {
    this(detector, new IntVector3(signBlock));
  }

  public DetectorSign(DetectorSignPair detector, IntVector3 signLocation) {
    super(signLocation);
    this.detector = detector;
  }

  public final DetectorSignPair detector;
  public boolean wasDown = false;

  @Override
  public boolean validate(SignActionEvent event) {
    return SignActionDetector.isValid(event);
  }

  @Override
  public boolean isLoaded(World world) {
    return world != null;
  }

  @Override
  public SignActionEvent getSignEvent(World world) {
    if (world == null) {
      return null;
    }
    this.loadChunks(world);
    return super.getSignEvent(world);
  }

  @Override
  public void onRemove(Block signblock) {
    if (this.detector.region != null) {
      DetectorRegion region = this.detector.region;
      region.unregister(this.detector);
      if (!region.isRegistered()) region.remove();
    }
  }

  public void onLeave(MinecartGroup group) {
    if (this.wasDown) {
      SignActionEvent event = getSignEvent(group.getWorld());
      if (event != null && event.isTrainSign() && isDown(event, null, group)) {
        this.wasDown = updateGroups(event);
      }
    }
  }

  public void onEnter(MinecartGroup group) {
    if (!this.wasDown) {
      SignActionEvent event = getSignEvent(group.getWorld());
      if (event != null && event.isTrainSign() && isDown(event, null, group)) {
        this.wasDown = true;
        event.setLevers(true);
      }
    }
  }

  public void onLeave(MinecartMember<?> member) {
    if (this.wasDown) {
      SignActionEvent event = getSignEvent(member.getEntity().getWorld());
      if (event != null && event.isCartSign() && isDown(event, member, null)) {
        this.wasDown = updateMembers(event);
      }
    }
  }

  public void onEnter(MinecartMember<?> member) {
    if (!this.wasDown) {
      SignActionEvent event = getSignEvent(member.getEntity().getWorld());
      if (event != null && event.isCartSign() && isDown(event, member, null)) {
        this.wasDown = true;
        event.setLevers(true);
      }
    }
  }

  public boolean updateMembers(SignActionEvent event) {
    for (MinecartMember<?> mm : this.detector.region.getMembers()) {
      if (isDown(event, mm, null)) {
        this.wasDown = true;
        event.setLevers(true);
        return true;
      }
    }
    this.wasDown = false;
    event.setLevers(false);
    return false;
  }

  public boolean updateGroups(SignActionEvent event) {
    for (MinecartGroup g : this.detector.region.getGroups()) {
      if (isDown(event, null, g)) {
        event.setLevers(true);
        return true;
      }
    }
    event.setLevers(false);
    return false;
  }

  public void onUpdate(MinecartMember<?> member) {
    SignActionEvent event = this.getSignEvent(member.getEntity().getWorld());
    if (event != null) this.updateMembers(event);
  }

  public void onUpdate(MinecartGroup group) {
    SignActionEvent event = this.getSignEvent(group.getWorld());
    if (event != null) this.updateMembers(event);
  }

  public boolean isDown(SignActionEvent event, MinecartMember<?> member, MinecartGroup group) {
    boolean firstEmpty = false;
    if (event.getLine(2).isEmpty()) {
      firstEmpty = true;
    } else if (Statement.has(member, group, event.getLine(2), event)) {
      return true;
    }
    if (event.getLine(3).isEmpty()) {
      return firstEmpty; //two empty lines, no statements, simple 'has'
    } else {
      return Statement.has(member, group, event.getLine(3), event);
    }
  }
}
TOP

Related Classes of com.bergerkiller.bukkit.tc.signactions.detector.DetectorSign

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.