Immature crop replanting, green thumb tweaks, replant accidental break

protection
This commit is contained in:
nossr50
2020-02-19 15:58:53 -08:00
parent 8f26544188
commit e2073ff9f7
8 changed files with 179 additions and 27 deletions

View File

@ -7,6 +7,7 @@ import com.gmail.nossr50.datatypes.BlockSnapshot;
import com.gmail.nossr50.datatypes.experience.XPGainReason;
import com.gmail.nossr50.datatypes.experience.XPGainSource;
import com.gmail.nossr50.datatypes.interactions.NotificationType;
import com.gmail.nossr50.datatypes.meta.RecentlyReplantedCropMeta;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
@ -14,6 +15,7 @@ import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
import com.gmail.nossr50.datatypes.skills.ToolType;
import com.gmail.nossr50.datatypes.treasure.HylianTreasure;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.runnables.skills.DelayedCropReplant;
import com.gmail.nossr50.runnables.skills.DelayedHerbalismXPCheckTask;
import com.gmail.nossr50.runnables.skills.HerbalismBlockUpdaterTask;
import com.gmail.nossr50.skills.SkillManager;
@ -158,6 +160,13 @@ public class HerbalismManager extends SkillManager {
private void processHerbalismOnBlocksBroken(BlockBreakEvent blockBreakEvent, HashSet<Block> brokenPlants) {
BlockState originalBreak = blockBreakEvent.getBlock().getState();
//Check if the plant was recently replanted
if(blockBreakEvent.getBlock().getMetadata(mcMMO.REPLANT_META_KEY).size() >= 1) {
//Crop is recently replanted to back out of destroying it
blockBreakEvent.setCancelled(true);
return;
}
//TODO: The design of Green Terra needs to change, this is a mess
if(Permissions.greenThumbPlant(getPlayer(), originalBreak.getType())) {
processGreenThumbPlants(originalBreak, blockBreakEvent, isGreenTerraActive());
@ -639,6 +648,18 @@ public class HerbalismManager extends SkillManager {
return Herbalism.convertShroomThumb(blockState);
}
/**
* Starts the delayed replant task and turns
* @param desiredCropAge the desired age of the crop
* @param blockBreakEvent the {@link BlockBreakEvent} this crop was involved in
* @param cropState the {@link BlockState} of the crop
*/
private void startReplantTask(int desiredCropAge, BlockBreakEvent blockBreakEvent, BlockState cropState, boolean isImmature) {
//Mark the plant as recently replanted to avoid accidental breakage
blockBreakEvent.getBlock().setMetadata(mcMMO.REPLANT_META_KEY, new RecentlyReplantedCropMeta(mcMMO.p));
new DelayedCropReplant(blockBreakEvent, cropState, desiredCropAge, isImmature).runTaskLater(mcMMO.p, 20 * 2);
}
/**
* Process the Green Thumb ability for plants.
*
@ -651,12 +672,13 @@ public class HerbalismManager extends SkillManager {
if (!(blockData instanceof Ageable))
return;
Ageable ageable = (Ageable) blockData;
//If the ageable is NOT mature and the player is NOT using a hoe, abort
if(!isAgeableMature((Ageable) blockData) && !ItemUtils.isHoe(getPlayer().getItemInHand())) {
if(!isAgeableMature(ageable) && !ItemUtils.isHoe(getPlayer().getItemInHand())) {
return;
}
Player player = getPlayer();
PlayerInventory playerInventory = player.getInventory();
Material seed = null;
@ -696,31 +718,36 @@ public class HerbalismManager extends SkillManager {
return;
}
if (!processGrowingPlants(blockState, blockBreakEvent, greenTerra)) {
if (!playerInventory.containsAtLeast(seedStack, 1)) {
return;
}
if(!ItemUtils.isHoe(getPlayer().getInventory().getItemInMainHand()))
{
if (!playerInventory.containsAtLeast(seedStack, 1)) {
return;
}
playerInventory.removeItem(seedStack);
player.updateInventory(); // Needed until replacement available
if (!processGrowingPlants(blockState, ageable, blockBreakEvent, greenTerra)) {
return;
}
playerInventory.removeItem(seedStack);
player.updateInventory(); // Needed until replacement available
new HerbalismBlockUpdaterTask(blockState).runTaskLater(mcMMO.p, 0);
}
private boolean processGrowingPlants(BlockState blockState, BlockBreakEvent blockBreakEvent, boolean greenTerra) {
Ageable crops = (Ageable) blockState.getBlockData();
private boolean processGrowingPlants(BlockState blockState, Ageable ageable, BlockBreakEvent blockBreakEvent, boolean greenTerra) {
//This check is needed
if(isBizarreAgeable(ageable)) {
return false;
}
int finalAge = 0;
int greenThumbStage = getGreenThumbStage();
//Immature plants will start over at 0
if(!isAgeableMature(crops)) {
crops.setAge(0);
if(!isAgeableMature(ageable)) {
blockBreakEvent.setCancelled(true);
startReplantTask(0, blockBreakEvent, blockState, true);
blockState.setType(Material.AIR);
blockState.update();
return true;
}
@ -733,10 +760,10 @@ public class HerbalismManager extends SkillManager {
case WHEAT:
if (greenTerra) {
crops.setAge(3);
finalAge = 3;
}
else {
crops.setAge(greenThumbStage);
finalAge = getGreenThumbStage();
}
break;
@ -744,30 +771,32 @@ public class HerbalismManager extends SkillManager {
case NETHER_WART:
if (greenTerra || greenThumbStage > 2) {
crops.setAge(2);
finalAge = 2;
}
else if (greenThumbStage == 2) {
crops.setAge(1);
finalAge = 1;
}
else {
crops.setAge(0);
finalAge = 0;
}
break;
case COCOA:
if (greenTerra || getGreenThumbStage() > 1) {
crops.setAge(1);
finalAge = 1;
}
else {
crops.setAge(0);
finalAge = 0;
}
break;
default:
return false;
}
blockState.setBlockData(crops);
//Start the delayed replant
startReplantTask(finalAge, blockBreakEvent, blockState, false);
return true;
}