/*
* CraftBook Copyright (C) 2010-2017 sk89q <http://www.sk89q.com>
* CraftBook Copyright (C) 2011-2017 me4502 <http://www.me4502.com>
* CraftBook Copyright (C) Contributors
*
* This program 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.
*
* This program 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 this program. If not,
* see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.craftbook.sponge.mechanics.ics.pinsets;
import com.sk89q.craftbook.sponge.CraftBookPlugin;
import com.sk89q.craftbook.sponge.mechanics.ics.IC;
import org.spongepowered.api.block.BlockType;
import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
public abstract class PinSet {
public abstract int getInputCount();
public abstract int getOutputCount();
public void setOutput(int outputId, boolean powered, IC ic) {
if(outputId == -1) return;
if (getOutput(outputId, ic) != powered) {
Location<?> block = getPinLocation(outputId + getInputCount(), ic);
if (!block.supports(Keys.POWERED)) return; // Can't set this.
block.offer(Keys.POWERED, powered, Cause.source(CraftBookPlugin.spongeInst().getContainer()).named("ic", ic).build());
}
}
public int getPinForLocation(IC ic, Location<World> location) {
for(int i = 0; i < getInputCount() + getOutputCount(); i++)
if(getPinLocation(i, ic).getBlockPosition().equals(location.getBlockPosition()))
return i;
return -1;
}
public boolean getInput(int inputId, IC ic) {
Location<World> pinLocation = getPinLocation(inputId, ic);
return inputId != -1 && (pinLocation.get(Keys.POWERED).orElse(false)
|| pinLocation.get(Keys.POWER).orElse(0) > 0)
|| pinLocation.getBlockType() == BlockTypes.POWERED_REPEATER
|| pinLocation.getBlockType() == BlockTypes.POWERED_COMPARATOR;
}
public boolean getOutput(int outputId, IC ic) {
return outputId != -1 && getPinLocation(getInputCount() + outputId, ic).get(Keys.POWERED).orElse(false);
}
public boolean isValid(int id, IC ic) {
BlockType type = getPinLocation(id, ic).getBlockType();
return type == BlockTypes.REDSTONE_WIRE || type == BlockTypes.LEVER;
}
public abstract String getName();
public abstract Location<World> getPinLocation(int id, IC ic);
}