2014-11-14 12:02:52 +01:00
|
|
|
/*
|
|
|
|
* This file is part of Applied Energistics 2.
|
|
|
|
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
|
|
|
|
*
|
|
|
|
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* Applied Energistics 2 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 Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
|
|
|
*/
|
|
|
|
|
2014-07-26 03:16:00 +02:00
|
|
|
package appeng.fmp;
|
|
|
|
|
2022-12-02 17:40:47 +01:00
|
|
|
import java.util.EnumSet;
|
|
|
|
import java.util.Set;
|
2015-04-03 08:54:31 +02:00
|
|
|
|
2017-04-12 16:10:13 +02:00
|
|
|
import appeng.api.parts.*;
|
|
|
|
import appeng.api.util.AEColor;
|
|
|
|
import appeng.api.util.DimensionalCoord;
|
|
|
|
import appeng.facade.FacadeContainer;
|
|
|
|
import appeng.parts.CableBusStorage;
|
|
|
|
import appeng.util.Platform;
|
|
|
|
import codechicken.lib.vec.BlockCoord;
|
|
|
|
import codechicken.multipart.TMultiPart;
|
|
|
|
import codechicken.multipart.TileMultipart;
|
2014-07-26 03:16:00 +02:00
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
import net.minecraft.tileentity.TileEntity;
|
|
|
|
import net.minecraft.util.Vec3;
|
|
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
2014-12-29 21:59:05 +01:00
|
|
|
|
2022-12-02 17:40:47 +01:00
|
|
|
public class FMPPlacementHelper implements IPartHost {
|
|
|
|
private static final CableBusStorage NULL_STORAGE = new NullStorage();
|
|
|
|
private boolean hasPart = false;
|
|
|
|
private TileMultipart myMP;
|
|
|
|
private CableBusPart myPart;
|
|
|
|
|
|
|
|
public FMPPlacementHelper(final TileMultipart mp) {
|
|
|
|
this.myMP = mp;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public IFacadeContainer getFacadeContainer() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return new FacadeContainer(NULL_STORAGE);
|
|
|
|
}
|
|
|
|
return this.myPart.getFacadeContainer();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean canAddPart(final ItemStack part, final ForgeDirection side) {
|
|
|
|
final CableBusPart myPart = this.getPart();
|
|
|
|
|
|
|
|
final boolean returnValue = this.hasPart && myPart.canAddPart(part, side);
|
|
|
|
|
|
|
|
this.removePart();
|
|
|
|
|
|
|
|
return returnValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
private CableBusPart getPart() {
|
|
|
|
final scala.collection.Iterator<TMultiPart> i = this.myMP.partList().iterator();
|
|
|
|
while (i.hasNext()) {
|
|
|
|
final TMultiPart p = i.next();
|
|
|
|
if (p instanceof CableBusPart) {
|
|
|
|
this.myPart = (CableBusPart) p;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.myPart == null) {
|
|
|
|
this.myPart = (CableBusPart) PartRegistry.CableBusPart.construct(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
final BlockCoord loc
|
|
|
|
= new BlockCoord(this.myMP.xCoord, this.myMP.yCoord, this.myMP.zCoord);
|
|
|
|
|
|
|
|
if (this.myMP.canAddPart(this.myPart) && Platform.isServer()) {
|
|
|
|
this.myMP = TileMultipart.addPart(this.myMP.getWorldObj(), loc, this.myPart);
|
|
|
|
this.hasPart = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.myPart;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void removePart() {
|
|
|
|
if (this.myPart.isEmpty()) {
|
|
|
|
final scala.collection.Iterator<TMultiPart> i
|
|
|
|
= this.myMP.partList().iterator();
|
|
|
|
while (i.hasNext()) {
|
|
|
|
final TMultiPart p = i.next();
|
|
|
|
if (p == this.myPart) {
|
|
|
|
this.myMP = this.myMP.remPart(this.myPart);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.hasPart = false;
|
|
|
|
this.myPart = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public ForgeDirection
|
|
|
|
addPart(final ItemStack is, final ForgeDirection side, final EntityPlayer owner) {
|
|
|
|
final CableBusPart myPart = this.getPart();
|
|
|
|
|
|
|
|
final ForgeDirection returnValue
|
|
|
|
= this.hasPart ? myPart.addPart(is, side, owner) : null;
|
|
|
|
|
|
|
|
this.removePart();
|
|
|
|
|
|
|
|
return returnValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public IPart getPart(final ForgeDirection side) {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return this.myPart.getPart(side);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void removePart(final ForgeDirection side, final boolean suppressUpdate) {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.myPart.removePart(side, suppressUpdate);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void markForUpdate() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.myPart.markForUpdate();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public DimensionalCoord getLocation() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return new DimensionalCoord(this.myMP);
|
|
|
|
}
|
|
|
|
return this.myPart.getLocation();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public TileEntity getTile() {
|
|
|
|
return this.myMP;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public AEColor getColor() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return AEColor.Transparent;
|
|
|
|
}
|
|
|
|
return this.myPart.getColor();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void clearContainer() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.myPart.clearContainer();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isBlocked(final ForgeDirection side) {
|
|
|
|
this.getPart();
|
|
|
|
|
|
|
|
final boolean returnValue = this.myPart.isBlocked(side);
|
|
|
|
|
|
|
|
this.removePart();
|
|
|
|
|
|
|
|
return returnValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public SelectedPart selectPart(final Vec3 pos) {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return new SelectedPart();
|
|
|
|
}
|
|
|
|
return this.myPart.selectPart(pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void markForSave() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.myPart.markForSave();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void partChanged() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.myPart.partChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean hasRedstone(final ForgeDirection side) {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return this.myPart.hasRedstone(side);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isEmpty() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return this.myPart.isEmpty();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Set<LayerFlags> getLayerFlags() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return EnumSet.noneOf(LayerFlags.class);
|
|
|
|
}
|
|
|
|
return this.myPart.getLayerFlags();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void cleanup() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.myPart.cleanup();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void notifyNeighbors() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.myPart.notifyNeighbors();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isInWorld() {
|
|
|
|
if (this.myPart == null) {
|
|
|
|
return this.myMP.getWorldObj() != null;
|
|
|
|
}
|
|
|
|
return this.myPart.isInWorld();
|
|
|
|
}
|
|
|
|
|
|
|
|
private static class NullStorage extends CableBusStorage {
|
|
|
|
@Override
|
|
|
|
public IFacadePart getFacade(final int x) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setFacade(final int x, final IFacadePart facade) {}
|
|
|
|
}
|
2014-07-26 03:16:00 +02:00
|
|
|
}
|