Begin updating to 1.19.3
This commit is contained in:
parent
b19fd441f8
commit
e0ec89d15d
7 changed files with 194 additions and 267 deletions
|
@ -3,8 +3,8 @@
|
||||||
org.gradle.jvmargs=-Xmx8G
|
org.gradle.jvmargs=-Xmx8G
|
||||||
org.gradle.daemon=false
|
org.gradle.daemon=false
|
||||||
|
|
||||||
my_version=1.3.4.4
|
my_version=1.3.5.0
|
||||||
|
|
||||||
mc_version=1.19.2
|
mc_version=1.19.3
|
||||||
forge_version=43.1.40
|
forge_version=44.1.0
|
||||||
libz_version=1.0.1.2
|
libz_version=1.0.2.0
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,5 +1,5 @@
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|
|
@ -110,8 +110,6 @@ public class Handler
|
||||||
|
|
||||||
|
|
||||||
HealerQueue.Pass=0;
|
HealerQueue.Pass=0;
|
||||||
HealerQueue.ToHeal.addAll(HealerQueue.ToValidate);
|
|
||||||
HealerQueue.ToValidate = new ArrayList<>();
|
|
||||||
|
|
||||||
HealerQueue.Shuffle();
|
HealerQueue.Shuffle();
|
||||||
|
|
||||||
|
|
|
@ -69,224 +69,9 @@ public class HealerManager implements Runnable
|
||||||
healerWorker.doTick=true;
|
healerWorker.doTick=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(HealerQueue.ToHeal.size()==0 && HealerQueue.ToValidate.size()==0)
|
|
||||||
{
|
|
||||||
HealerQueue.Pass=0;
|
|
||||||
if(HealerQueue.dirty())
|
|
||||||
HealerQueue.dump();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the first block in the list
|
|
||||||
final StoredBlock sb = HealerQueue.locateLowestBlock(HealerQueue.ToHeal);
|
|
||||||
ServerLevel level = null;
|
|
||||||
StoredBlock below = null;
|
|
||||||
|
|
||||||
if(sb != null)
|
|
||||||
{
|
|
||||||
level = sb.getWorldPosition().getActualDimension();
|
|
||||||
below = HealerQueue.getExact(new WorldPosition(sb.getWorldPosition().Position.moveDown(), level));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
switch(HealerQueue.Pass)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
// Pass 1. Set all positions to bedrock
|
|
||||||
// The code will check is the block is solid. If the block below it is not solid, it will set it to air, regardless of if it is a falling block of not
|
|
||||||
|
|
||||||
if(HealerQueue.ToHeal.size()==0)
|
|
||||||
{
|
|
||||||
// Move the validate list back into healer queue, and increment pass
|
|
||||||
OTEMod.LOGGER.info("Pass 1 completed, moving to pass 2");
|
|
||||||
HealerQueue.Pass=1;
|
|
||||||
HealerQueue.ToHeal = HealerQueue.ToValidate;
|
|
||||||
HealerQueue.ToValidate = new ArrayList<>();
|
|
||||||
HealerQueue.dump();
|
|
||||||
break; // Exit this loop
|
|
||||||
}
|
|
||||||
|
|
||||||
if(below == null){
|
|
||||||
// This line will prevent the block below from getting set to Sculk
|
|
||||||
below = StoredBlock.getSculk(new WorldPosition(sb.getWorldPosition().Position.moveDown(), level)); // below is null so it is a unknown, accept a loss if its a falling block
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(!sb.getState().isAir() && below.getState().isAir())
|
|
||||||
{
|
|
||||||
HealRunner.scheduleHeal(StoredBlock.getSculk(below.getWorldPosition()));
|
|
||||||
skipWait=false;
|
|
||||||
}else {
|
|
||||||
if(!sb.getState().isAir())
|
|
||||||
{
|
|
||||||
HealRunner.scheduleHeal(StoredBlock.getSculk(sb.getWorldPosition()));
|
|
||||||
skipWait=false;
|
|
||||||
} else {
|
|
||||||
skipWait=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
HealerQueue.ToValidate.add(sb);
|
|
||||||
HealerQueue.ToHeal.remove(sb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
// Pass 2 only sets the solid blocks
|
|
||||||
if(HealerQueue.ToHeal.size()==0)
|
|
||||||
{
|
|
||||||
OTEMod.LOGGER.info("Pass 2 completed, moving to pass 3");
|
|
||||||
HealerQueue.Pass++;
|
|
||||||
HealerQueue.ToHeal = HealerQueue.ToValidate;
|
|
||||||
HealerQueue.ToValidate = new ArrayList<>();
|
|
||||||
HealerQueue.dump();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!sb.getState().isAir())
|
|
||||||
{
|
|
||||||
skipWait=false;
|
|
||||||
HealRunner.scheduleHeal(sb);
|
|
||||||
}else{
|
|
||||||
skipWait=true;
|
|
||||||
|
|
||||||
HealerQueue.ToValidate.add(sb);
|
|
||||||
}
|
|
||||||
HealerQueue.ToHeal.remove(sb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
// Pass 3 removes bedrock by setting blocks that are air
|
|
||||||
if(HealerQueue.ToHeal.size()==0)
|
|
||||||
{
|
|
||||||
OTEMod.LOGGER.info("Pass 3 has been completed. Ending restore");
|
|
||||||
HealerQueue.Pass=0;
|
|
||||||
HealerQueue.ToHeal.clear();
|
|
||||||
HealerQueue.ToValidate.clear();
|
|
||||||
HealerQueue.dump();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
HealerQueue.ToHeal.remove(sb);
|
|
||||||
|
|
||||||
if(sb.getState().isAir())
|
|
||||||
{
|
|
||||||
BlockState bs = sb.getWorldPosition().getActualDimension().getBlockState(sb.getPos());
|
|
||||||
if(!bs.isAir() && !bs.is(Blocks.SCULK))
|
|
||||||
{
|
|
||||||
skipWait=true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(!bs.isAir()){
|
|
||||||
skipWait=false;
|
|
||||||
HealRunner.scheduleHeal(sb);
|
|
||||||
}else skipWait=true;
|
|
||||||
}else skipWait=true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
HealerQueue.Pass=0;
|
|
||||||
OTEMod.LOGGER.info("/!\\ ALERT /!\\\n\nWARNING: Unknown pass operation was added to the HealQueue");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}catch(Exception e){}
|
}catch(Exception e){}
|
||||||
}
|
}
|
||||||
OTEMod.ALIVE=false;
|
|
||||||
/*while(OTEMod.ALIVE) // do nothing, code is disabled here.
|
|
||||||
{
|
|
||||||
try{
|
|
||||||
|
|
||||||
// Loop back to start if no items in queue
|
|
||||||
if(HealerQueue.ToHeal.size()==0){
|
|
||||||
|
|
||||||
if(HealerQueue.ToValidate.size()==0)continue;
|
|
||||||
|
|
||||||
boolean redo = false;
|
|
||||||
// Validate success
|
|
||||||
for(StoredBlock sb : HealerQueue.ToValidate)
|
|
||||||
{
|
|
||||||
try{
|
|
||||||
|
|
||||||
final ServerLevel level = sb.getWorldPosition().getActualDimension();
|
|
||||||
if(!level.getBlockState(sb.getPos()).is(sb.getState().getBlock()))
|
|
||||||
{
|
|
||||||
redo=true;
|
|
||||||
// Redo restore
|
|
||||||
HealerQueue.ToHeal.add(sb);
|
|
||||||
}
|
|
||||||
}catch(Exception e){}
|
|
||||||
}
|
|
||||||
|
|
||||||
HealerQueue.ToValidate.clear();
|
|
||||||
OTEMod.LOGGER.info("Validation of restore completed");
|
|
||||||
HealerQueue.dump();
|
|
||||||
|
|
||||||
if(redo)
|
|
||||||
{
|
|
||||||
HealerQueue.Shuffle();
|
|
||||||
OTEMod.LOGGER.info("Validation was not successful, and the repair will be repeated");
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the first block in the list
|
|
||||||
final StoredBlock sb = HealerQueue.locateHighestBlock(HealerQueue.ToHeal);
|
|
||||||
final ServerLevel level = sb.getWorldPosition().getActualDimension();
|
|
||||||
|
|
||||||
// Remove the block from the queue now to prevent further issues
|
|
||||||
if( !HealerQueue.ToValidate.add(sb) )
|
|
||||||
{
|
|
||||||
OTEMod.LOGGER.info("Failed to add Block to Validation queue!!! Verification of restore will not work");
|
|
||||||
}else
|
|
||||||
HealerQueue.ToHeal.remove(sb);
|
|
||||||
|
|
||||||
// Healer object should have been added to the validation list
|
|
||||||
|
|
||||||
|
|
||||||
// Check if the block to restore, and the block at position are air.
|
|
||||||
if(level.getBlockState(sb.getPos()).isAir() && sb.getState().isAir()){
|
|
||||||
skipWait=true;
|
|
||||||
continue; // Skip the wait, and this block
|
|
||||||
} else skipWait=false;
|
|
||||||
|
|
||||||
|
|
||||||
if(skipWait)
|
|
||||||
{
|
|
||||||
if(skipCount > 5){
|
|
||||||
skipCount=0;
|
|
||||||
skipWait=false;// Give the server a chance to breathe
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
skipCount++;
|
|
||||||
}
|
|
||||||
}else skipCount=0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(!skipWait) // Only save the queue when sleeping appropriately
|
|
||||||
{
|
|
||||||
|
|
||||||
if(lastSave+saveInterval < Instant.now().getEpochSecond()){
|
|
||||||
|
|
||||||
try {
|
|
||||||
HealerQueue.dump();
|
|
||||||
lastSave = Instant.now().getEpochSecond();
|
|
||||||
OTEMod.LOGGER.info("Flushing current healer queue to disk...");
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}catch (Exception e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
OTEMod.LOGGER.info("Tearing down healer jobs. Saving remaining queue, stand by...");
|
OTEMod.LOGGER.info("Tearing down healer jobs. Saving remaining queue, stand by...");
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -32,13 +32,11 @@ public class HealerQueue {
|
||||||
public static final String HealerQueueDebugFile = "OTEHealerLastQueue.snbt";
|
public static final String HealerQueueDebugFile = "OTEHealerLastQueue.snbt";
|
||||||
|
|
||||||
public static List<StoredBlock> ToHeal = new ArrayList<StoredBlock>(); // Air and Solid Blocks get set to bedrock initially
|
public static List<StoredBlock> ToHeal = new ArrayList<StoredBlock>(); // Air and Solid Blocks get set to bedrock initially
|
||||||
public static List<StoredBlock> ToValidate = new ArrayList<StoredBlock>(); // This contains all the blocks except air
|
|
||||||
|
|
||||||
public static int Pass = 0;
|
public static int Pass = 0;
|
||||||
|
|
||||||
|
|
||||||
private static List<StoredBlock> LastToHeal = new ArrayList<StoredBlock>();
|
private static List<StoredBlock> LastToHeal = new ArrayList<StoredBlock>();
|
||||||
private static List<StoredBlock> LastToValidate = new ArrayList<StoredBlock>();
|
|
||||||
private static int LastPass = 0;
|
private static int LastPass = 0;
|
||||||
|
|
||||||
public static HealerManager ManagerInstance=null;
|
public static HealerManager ManagerInstance=null;
|
||||||
|
@ -91,6 +89,30 @@ public class HealerQueue {
|
||||||
return sb;
|
return sb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static StoredBlock locateLowestBlockForWorker(List<StoredBlock> list, HealerWorker worker)
|
||||||
|
{
|
||||||
|
StoredBlock sb = null;
|
||||||
|
double currentY = 300;
|
||||||
|
for (StoredBlock storedBlock : ToHeal) {
|
||||||
|
if(storedBlock.getWorldPosition().Position.y < currentY && storedBlock.isClaimedBy(worker))
|
||||||
|
{
|
||||||
|
currentY = storedBlock.getWorldPosition().Position.y;
|
||||||
|
sb=storedBlock;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<StoredBlock> getBlocksByWorker(HealerWorker worker)
|
||||||
|
{
|
||||||
|
List<StoredBlock> blocks = new ArrayList<>();
|
||||||
|
for (StoredBlock storedBlock : ToHeal) {
|
||||||
|
if(storedBlock.isClaimedBy(worker))blocks.add(storedBlock);
|
||||||
|
}
|
||||||
|
return blocks;
|
||||||
|
}
|
||||||
|
|
||||||
public static StoredBlock getExact(WorldPosition wp)
|
public static StoredBlock getExact(WorldPosition wp)
|
||||||
{
|
{
|
||||||
for (StoredBlock storedBlock : ToHeal) {
|
for (StoredBlock storedBlock : ToHeal) {
|
||||||
|
@ -99,12 +121,6 @@ public class HealerQueue {
|
||||||
return storedBlock;
|
return storedBlock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (StoredBlock storedBlock : ToValidate) {
|
|
||||||
if(storedBlock.getWorldPosition().same(wp))
|
|
||||||
{
|
|
||||||
return storedBlock;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -121,9 +137,6 @@ public class HealerQueue {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (StoredBlock storedBlock : ToValidate) {
|
|
||||||
if(storedBlock.getWorldPosition().same(real))return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -180,6 +193,11 @@ public class HealerQueue {
|
||||||
Thread txx = new Thread(ManagerInstance);
|
Thread txx = new Thread(ManagerInstance);
|
||||||
txx.start();
|
txx.start();
|
||||||
|
|
||||||
|
HealerWorker worker = new HealerWorker(ToHeal);
|
||||||
|
Thread txxx = new Thread(worker);
|
||||||
|
ManagerInstance.registerWorker(worker);
|
||||||
|
txxx.start();
|
||||||
|
|
||||||
OTEMod.HEALER_THREAD = txx;
|
OTEMod.HEALER_THREAD = txx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,14 +210,8 @@ public class HealerQueue {
|
||||||
{
|
{
|
||||||
lst.add(block.serialize());
|
lst.add(block.serialize());
|
||||||
}
|
}
|
||||||
ListTag lst2 = new ListTag();
|
|
||||||
for(final StoredBlock block : HealerQueue.ToValidate)
|
|
||||||
{
|
|
||||||
lst2.add(block.serialize());
|
|
||||||
}
|
|
||||||
|
|
||||||
tag.put("queue", lst);
|
tag.put("queue", lst);
|
||||||
tag.put("validate", lst2);
|
|
||||||
tag.putInt("pass", HealerQueue.Pass);
|
tag.putInt("pass", HealerQueue.Pass);
|
||||||
|
|
||||||
//OTEMod.LOGGER.info("HEAL ["+HealerQueue.ToHeal.size()+"] / VALIDATE ["+HealerQueue.ToValidate.size()+"]");
|
//OTEMod.LOGGER.info("HEAL ["+HealerQueue.ToHeal.size()+"] / VALIDATE ["+HealerQueue.ToValidate.size()+"]");
|
||||||
|
@ -212,7 +224,6 @@ public class HealerQueue {
|
||||||
public static List<StoredBlock> removeSame(List<StoredBlock> other)
|
public static List<StoredBlock> removeSame(List<StoredBlock> other)
|
||||||
{
|
{
|
||||||
other=removeSameFrom(ToHeal, other);
|
other=removeSameFrom(ToHeal, other);
|
||||||
other=removeSameFrom(ToValidate,other);
|
|
||||||
|
|
||||||
return other;
|
return other;
|
||||||
}
|
}
|
||||||
|
@ -243,11 +254,6 @@ public class HealerQueue {
|
||||||
ToHeal.remove(i);
|
ToHeal.remove(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < ToValidate.size(); i++) {
|
|
||||||
if(ToValidate.get(i).getWorldPosition().same(pos)){
|
|
||||||
ToValidate.remove(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -261,6 +267,7 @@ public class HealerQueue {
|
||||||
// Read the list
|
// Read the list
|
||||||
|
|
||||||
ListTag items = tag.getList("queue", Tag.TAG_COMPOUND);
|
ListTag items = tag.getList("queue", Tag.TAG_COMPOUND);
|
||||||
|
|
||||||
|
|
||||||
for(int i=0;i<items.size();i++)
|
for(int i=0;i<items.size();i++)
|
||||||
{
|
{
|
||||||
|
@ -268,33 +275,20 @@ public class HealerQueue {
|
||||||
StoredBlock sb = new StoredBlock(stored);
|
StoredBlock sb = new StoredBlock(stored);
|
||||||
HealerQueue.ToHeal.add(sb);
|
HealerQueue.ToHeal.add(sb);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OTEMod.LOGGER.info("Finished loading the queue ["+HealerQueue.ToHeal.size()+"] items");
|
OTEMod.LOGGER.info("Finished loading the queue ["+HealerQueue.ToHeal.size()+"] items");
|
||||||
|
|
||||||
if(tag.contains("validate"))
|
|
||||||
{
|
|
||||||
HealerQueue.ToValidate.clear();
|
|
||||||
|
|
||||||
ListTag items2 = tag.getList("validate", Tag.TAG_COMPOUND);
|
|
||||||
for(int i=0;i<items2.size();i++)
|
|
||||||
{
|
|
||||||
CompoundTag stored = items2.getCompound(i);
|
|
||||||
StoredBlock sb = new StoredBlock(stored);
|
|
||||||
HealerQueue.ToValidate.add(sb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HealerQueue.Pass = tag.getInt("pass");
|
HealerQueue.Pass = tag.getInt("pass");
|
||||||
|
|
||||||
OTEMod.LOGGER.info("Finished loading validation queue for healer ["+HealerQueue.ToValidate.size()+"] items");
|
|
||||||
OTEMod.HEALER_WAIT=false;
|
OTEMod.HEALER_WAIT=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean dirty()
|
public static boolean dirty()
|
||||||
{
|
{
|
||||||
if(ToHeal!=LastToHeal)return true;
|
if(ToHeal!=LastToHeal)return true;
|
||||||
if(ToValidate!=LastToValidate)return true;
|
|
||||||
if(Pass != LastPass)return true;
|
if(Pass != LastPass)return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -302,7 +296,6 @@ public class HealerQueue {
|
||||||
public static void dump() throws IOException
|
public static void dump() throws IOException
|
||||||
{
|
{
|
||||||
LastToHeal = ToHeal;
|
LastToHeal = ToHeal;
|
||||||
LastToValidate = ToValidate;
|
|
||||||
LastPass = Pass;
|
LastPass = Pass;
|
||||||
CompoundTag serialized = HealerQueue.serialize();
|
CompoundTag serialized = HealerQueue.serialize();
|
||||||
if(OTEServerConfig.DEBUG_HEALER.get())
|
if(OTEServerConfig.DEBUG_HEALER.get())
|
||||||
|
|
|
@ -1,16 +1,27 @@
|
||||||
package dev.zontreck.otemod.antigrief;
|
package dev.zontreck.otemod.antigrief;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.BlockingQueue;
|
import java.util.concurrent.BlockingQueue;
|
||||||
|
|
||||||
|
import dev.zontreck.libzontreck.vectors.WorldPosition;
|
||||||
import dev.zontreck.otemod.OTEMod;
|
import dev.zontreck.otemod.OTEMod;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.world.level.block.Blocks;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
public class HealerWorker implements Runnable
|
public class HealerWorker implements Runnable
|
||||||
{
|
{
|
||||||
private final List<StoredBlock> proc;
|
private List<StoredBlock> proc;
|
||||||
public boolean alive=false; // These are the
|
public boolean alive=false; // These are the
|
||||||
public boolean doTick = false;
|
public boolean doTick = false;
|
||||||
public Thread MyThread;
|
public Thread MyThread;
|
||||||
|
|
||||||
|
private boolean skipWait;
|
||||||
|
|
||||||
|
public int Pass; // A local pass for this worker
|
||||||
|
|
||||||
|
|
||||||
public HealerWorker(List<StoredBlock> toProcess)
|
public HealerWorker(List<StoredBlock> toProcess)
|
||||||
{
|
{
|
||||||
// TODO: Make this a individualized heal worker that does the task of the current HealerManager, but with a central list of positions for de-duplication. But that a second worker would not process the same positions
|
// TODO: Make this a individualized heal worker that does the task of the current HealerManager, but with a central list of positions for de-duplication. But that a second worker would not process the same positions
|
||||||
|
@ -25,16 +36,21 @@ public class HealerWorker implements Runnable
|
||||||
@Override
|
@Override
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
|
alive=true;
|
||||||
MyThread=Thread.currentThread();
|
MyThread=Thread.currentThread();
|
||||||
HealerQueue.ManagerInstance.registerWorker(this);
|
HealerQueue.ManagerInstance.registerWorker(this);
|
||||||
for (StoredBlock storedBlock : proc) {
|
OTEMod.LOGGER.info("Hello from Healer Worker "+Thread.currentThread().getName());
|
||||||
storedBlock.setClaimedBy(Thread.currentThread());
|
|
||||||
|
for(int i=0;i<proc.size();i++){
|
||||||
|
StoredBlock sb = proc.get(i);
|
||||||
|
sb.setClaimedBy(MyThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(alive){
|
while(alive && OTEMod.ALIVE){
|
||||||
// Stay alive
|
// Stay alive
|
||||||
// The tick event will be fired when appropriate
|
// The tick event will be fired when appropriate
|
||||||
if(doTick)tick();
|
if(doTick)tick();
|
||||||
|
if(skipWait)tick();
|
||||||
|
|
||||||
|
|
||||||
doTick=false;
|
doTick=false;
|
||||||
|
@ -47,8 +63,136 @@ public class HealerWorker implements Runnable
|
||||||
|
|
||||||
public void tick()
|
public void tick()
|
||||||
{
|
{
|
||||||
// A tick in the healer worker tells it to repair a block
|
|
||||||
// The healer manager is responsible for dispatching ticks
|
try{
|
||||||
|
|
||||||
|
// A tick in the healer worker tells it to repair a block
|
||||||
|
// The healer manager is responsible for dispatching ticks
|
||||||
|
|
||||||
|
|
||||||
|
if(proc.size()==0 && HealerQueue.getBlocksByWorker(this).size()==0)
|
||||||
|
{
|
||||||
|
alive=false;
|
||||||
|
if(HealerQueue.dirty())
|
||||||
|
HealerQueue.dump();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the first block in the list
|
||||||
|
final StoredBlock sb = HealerQueue.locateLowestBlock(proc);
|
||||||
|
ServerLevel level = null;
|
||||||
|
StoredBlock below = null;
|
||||||
|
|
||||||
|
if(sb != null)
|
||||||
|
{
|
||||||
|
level = sb.getWorldPosition().getActualDimension();
|
||||||
|
below = HealerQueue.getExact(new WorldPosition(sb.getWorldPosition().Position.moveDown(), level));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
switch(Pass)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
// Pass 1. Set all positions to bedrock
|
||||||
|
// The code will check is the block is solid. If the block below it is not solid, it will set it to air, regardless of if it is a falling block of not
|
||||||
|
|
||||||
|
if(proc.size()==0)
|
||||||
|
{
|
||||||
|
// Move the validate list back into healer queue, and increment pass
|
||||||
|
OTEMod.LOGGER.info("Pass 1 completed, moving to pass 2");
|
||||||
|
Pass=1;
|
||||||
|
proc = HealerQueue.getBlocksByWorker(this);
|
||||||
|
HealerQueue.dump();
|
||||||
|
break; // Exit this loop
|
||||||
|
}
|
||||||
|
|
||||||
|
if(below == null){
|
||||||
|
// This line will prevent the block below from getting set to Sculk
|
||||||
|
below = StoredBlock.getSculk(new WorldPosition(sb.getWorldPosition().Position.moveDown(), level)); // below is null so it is a unknown, accept a loss if its a falling block
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(!sb.getState().isAir() && below.getState().isAir())
|
||||||
|
{
|
||||||
|
HealRunner.scheduleHeal(StoredBlock.getSculk(below.getWorldPosition()));
|
||||||
|
skipWait=false;
|
||||||
|
}else {
|
||||||
|
if(!sb.getState().isAir())
|
||||||
|
{
|
||||||
|
HealRunner.scheduleHeal(StoredBlock.getSculk(sb.getWorldPosition()));
|
||||||
|
skipWait=false;
|
||||||
|
} else {
|
||||||
|
skipWait=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
proc.remove(sb);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
// Pass 2 only sets the solid blocks
|
||||||
|
if(proc.size()==0)
|
||||||
|
{
|
||||||
|
OTEMod.LOGGER.info("Pass 2 completed, moving to pass 3");
|
||||||
|
Pass++;
|
||||||
|
proc = HealerQueue.getBlocksByWorker(this);
|
||||||
|
HealerQueue.dump();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!sb.getState().isAir())
|
||||||
|
{
|
||||||
|
skipWait=false;
|
||||||
|
HealRunner.scheduleHeal(sb);
|
||||||
|
HealerQueue.ToHeal.remove(sb);
|
||||||
|
}else{
|
||||||
|
skipWait=true;
|
||||||
|
|
||||||
|
}
|
||||||
|
proc.remove(sb);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
// Pass 3 removes bedrock by setting blocks that are air
|
||||||
|
if(proc.size()==0)
|
||||||
|
{
|
||||||
|
OTEMod.LOGGER.info("Pass 3 has been completed. Ending restore");
|
||||||
|
Pass=0;
|
||||||
|
proc.clear();
|
||||||
|
HealerQueue.dump();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
proc.remove(sb);
|
||||||
|
HealerQueue.ToHeal.remove(sb);
|
||||||
|
|
||||||
|
if(sb.getState().isAir())
|
||||||
|
{
|
||||||
|
BlockState bs = sb.getWorldPosition().getActualDimension().getBlockState(sb.getPos());
|
||||||
|
if(!bs.isAir() && !bs.is(Blocks.SCULK))
|
||||||
|
{
|
||||||
|
skipWait=true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!bs.isAir()){
|
||||||
|
skipWait=false;
|
||||||
|
HealRunner.scheduleHeal(sb);
|
||||||
|
}else skipWait=true;
|
||||||
|
}else skipWait=true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
Pass=0;
|
||||||
|
OTEMod.LOGGER.info("/!\\ ALERT /!\\\n\nWARNING: Unknown pass operation was added to the HealQueue");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch(Exception e){}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,12 @@ public class StoredBlock implements Comparable
|
||||||
claimed_by=tx;
|
claimed_by=tx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isClaimedBy(HealerWorker worker)
|
||||||
|
{
|
||||||
|
if(worker.MyThread == claimed_by && claimed())return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public StoredBlock(final BlockPos pos, final BlockState toSave, final ServerLevel lvl)
|
public StoredBlock(final BlockPos pos, final BlockState toSave, final ServerLevel lvl)
|
||||||
{
|
{
|
||||||
|
@ -159,6 +165,7 @@ public class StoredBlock implements Comparable
|
||||||
final CompoundTag tmp = tag.getCompound("entity");
|
final CompoundTag tmp = tag.getCompound("entity");
|
||||||
blockEntity = tmp.isEmpty() ? null : tmp;
|
blockEntity = tmp.isEmpty() ? null : tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(Object o) {
|
public int compareTo(Object o) {
|
||||||
if(o instanceof StoredBlock)
|
if(o instanceof StoredBlock)
|
||||||
|
|
Reference in a new issue