/**
* Copyright 2014
* SMEdit https://github.com/StarMade/SMEdit
* SMTools https://github.com/StarMade/SMTools
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
**/
package jo.sm.plugins.ship.move;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import jo.sm.data.BlockTypes;
import jo.sm.data.SparseMatrix;
import jo.sm.data.StarMade;
import jo.sm.mods.IBlocksPlugin;
import jo.sm.mods.IPluginCallback;
import jo.sm.ship.data.Block;
import jo.vecmath.Point3i;
public class MovePlugin implements IBlocksPlugin {
public static final String NAME = "Move";
public static final String DESC = "Move ship's core.";
public static final String AUTH = "Jo Jaquinta";
public static final int[][] CLASSIFICATIONS
= {
{TYPE_SHIP, SUBTYPE_MODIFY},};
private static final Logger log = Logger.getLogger(MovePlugin.class.getName());
public static SparseMatrix<Block> shift(SparseMatrix<Block> original, int dx, int dy, int dz, IPluginCallback cb) {
cb.startTask(original.size());
SparseMatrix<Block> modified;
modified = new SparseMatrix<>();
for (Iterator<Point3i> i = original.iteratorNonNull(); i.hasNext();) {
cb.workTask(1);
Point3i from;
from = i.next();
Point3i to;
to = new Point3i(from.x - dx, from.y - dy, from.z - dz);
Block b;
b = original.get(from);
if (b.getBlockID() == BlockTypes.CORE_ID) {
short newID = getFiller(original, from);
if (newID == -1) {
continue;
}
b = new Block(newID);
}
modified.set(to, b);
}
return modified;
}
private static short getFiller(SparseMatrix<Block> grid, Point3i p) {
Map<Short, Integer> votes = new HashMap<>();
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
for (int dz = -1; dz <= 1; dz++) {
if ((dx != 0) || (dy != 0) || (dz != 0)) {
Block b = grid.get(p.x + dx, p.y + dy, p.z + dz);
if (b != null) {
Integer v = votes.get(b.getBlockID());
if (v == null) {
v = 1;
} else {
v = v + 1;
}
votes.put(b.getBlockID(), v);
}
}
}
}
}
short best = -1;
int bestv;
bestv = 0;
for (Short test : votes.keySet()) {
if (votes.get(test) > bestv) {
best = test;
bestv = votes.get(best);
}
}
return best;
}
public static Point3i findCore(SparseMatrix<Block> grid) {
for (Iterator<Point3i> i = grid.iteratorNonNull(); i.hasNext();) {
Point3i xyz = i.next();
if (grid.get(xyz).getBlockID() == BlockTypes.CORE_ID) {
return xyz;
}
}
return null;
}
@Override
public String getName() {
return NAME;
}
@Override
public String getDescription() {
return DESC;
}
@Override
public String getAuthor() {
return AUTH;
}
@Override
public Object newParameterBean() {
return new MoveParameters();
}
@Override
public void initParameterBean(SparseMatrix<Block> original, Object params, StarMade sm, IPluginCallback cb) {
}
@Override
public int[][] getClassifications() {
return CLASSIFICATIONS;
}
@Override
public SparseMatrix<Block> modify(SparseMatrix<Block> original, Object p, StarMade sm, IPluginCallback cb) {
MoveParameters params;
params = (MoveParameters) p;
//System.out.println("Params: X="+params.getXRotate()
// +", Y="+params.getYRotate()
// +", Z="+params.getZRotate());
Point3i core;
core = findCore(original);
log.log(Level.WARNING, "Core at: ", core);
SparseMatrix<Block> modified = shift(original, params.getXMove(), params.getYMove(), params.getZMove(), cb);
// copy core
modified.set(core, original.get(core));
return modified;
}
}