mirror of
https://github.com/GTNewHorizons/EnderIO.git
synced 2026-10-26 14:24:40 +00:00
90 lines
2.8 KiB
Java
90 lines
2.8 KiB
Java
package crazypants.enderio.conduit.geom;
|
|
|
|
import java.util.Collection;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
|
|
|
import crazypants.enderio.conduit.IConduit;
|
|
|
|
public class CollidableCache {
|
|
|
|
public static final CollidableCache instance = new CollidableCache();
|
|
|
|
private final Map<CacheKey, Collection<CollidableComponent>> cache = new HashMap<>();
|
|
|
|
public CacheKey createKey(Class<? extends IConduit> baseType, Offset offset, ForgeDirection dir, boolean isStub) {
|
|
return new CacheKey(baseType, offset, dir, isStub);
|
|
}
|
|
|
|
public Collection<CollidableComponent> getCollidables(CacheKey key, IConduit conduit) {
|
|
Collection<CollidableComponent> result = cache.get(key);
|
|
if (result == null) {
|
|
result = conduit.createCollidables(key);
|
|
cache.put(key, result);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static class CacheKey {
|
|
|
|
public final Class<? extends IConduit> baseType;
|
|
public final String className; // used to generate reliable equals /
|
|
// hashcode
|
|
public final Offset offset;
|
|
public final ForgeDirection dir;
|
|
public final boolean isStub;
|
|
|
|
public CacheKey(Class<? extends IConduit> baseType, Offset offset, ForgeDirection dir, boolean isStub) {
|
|
this.baseType = baseType;
|
|
className = baseType.getCanonicalName();
|
|
this.offset = offset;
|
|
this.dir = dir;
|
|
this.isStub = isStub;
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
final int prime = 31;
|
|
int result = 1;
|
|
result = prime * result + ((className == null) ? 0 : className.hashCode());
|
|
result = prime * result + ((dir == null) ? 0 : dir.hashCode());
|
|
result = prime * result + (isStub ? 1231 : 1237);
|
|
result = prime * result + ((offset == null) ? 0 : offset.hashCode());
|
|
return result;
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object obj) {
|
|
if (this == obj) {
|
|
return true;
|
|
}
|
|
if (obj == null) {
|
|
return false;
|
|
}
|
|
if (getClass() != obj.getClass()) {
|
|
return false;
|
|
}
|
|
CacheKey other = (CacheKey) obj;
|
|
if (className == null) {
|
|
if (other.className != null) {
|
|
return false;
|
|
}
|
|
} else if (!className.equals(other.className)) {
|
|
return false;
|
|
}
|
|
if (dir != other.dir) {
|
|
return false;
|
|
}
|
|
if (isStub != other.isStub) {
|
|
return false;
|
|
}
|
|
if (offset != other.offset) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|