package de.jaschastarke.minecraft.limitedcreative.blockstate.worldedit;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.LocalPlayer;
import com.sk89q.worldedit.LocalWorld;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.bags.BlockBag;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.patterns.Pattern;
import com.sk89q.worldedit.regions.Region;
import de.jaschastarke.minecraft.limitedcreative.blockstate.DBModel.DBTransaction;
public class LCEditSession extends EditSession {
private LCEditSessionFactory factory;
private LocalPlayer player;
public LCEditSession(LCEditSessionFactory factory, LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player) {
super(world, maxBlocks, blockBag);
this.factory = factory;
this.player = player;
}
public LCEditSession(LCEditSessionFactory factory, LocalWorld world, int maxBlocks, LocalPlayer player) {
super(world, maxBlocks);
this.factory = factory;
this.player = player;
}
private DBTransaction transaction;
@Override
public void flushQueue() {
transaction = factory.getModel().groupUpdate();
super.flushQueue();
if (transaction != null) {
transaction.finish();
transaction = null;
}
}
@Override
public int setBlocks(Region region, BaseBlock block) throws MaxChangedBlocksException {
boolean useTransaction = false;
if (transaction == null) {
transaction = factory.getModel().groupUpdate();
useTransaction = true;
}
int ret;
try {
ret = super.setBlocks(region, block);
} catch (MaxChangedBlocksException e) {
transaction = null;
throw e;
}
if (transaction != null && useTransaction) {
transaction.finish();
transaction = null;
}
return ret;
}
@Override
public int setBlocks(Region region, Pattern pattern) throws MaxChangedBlocksException {
boolean useTransaction = false;
if (transaction == null) {
transaction = factory.getModel().groupUpdate();
useTransaction = true;
}
int ret;
try {
ret = super.setBlocks(region, pattern);
} catch (MaxChangedBlocksException e) {
transaction = null;
throw e;
}
if (transaction != null && useTransaction) {
transaction.finish();
transaction = null;
}
return ret;
}
@Override
public boolean rawSetBlock(Vector pt, BaseBlock block) {
boolean success = super.rawSetBlock(pt, block);
if (success) {
if (transaction != null) {
factory.onTransactionBlockEdit(transaction, player, pt, block);
} else {
factory.onBlockEdit(player, pt, block);
}
}
return success;
}
}