Improved MLG handling

- Added blacklist for scenarios where MLG wouldn't block fall damage (or fail to place)
-Water buckets now waterlog if possible
Note: This still means that any non-solid blocks like signs are treated as air and are destroyed at MLG.
This commit is contained in:
ThisTestUser
2022-10-07 21:10:55 -04:00
parent a0c92d5097
commit 3fa35c17f9
4 changed files with 229 additions and 12 deletions

View File

@@ -17,6 +17,7 @@ import net.nuggetmc.tplus.api.utils.PlayerUtils;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.block.data.Waterlogged;
import org.bukkit.block.data.type.*; import org.bukkit.block.data.type.*;
import org.bukkit.entity.*; import org.bukkit.entity.*;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -337,26 +338,50 @@ public class LegacyAgent extends Agent {
Material itemType; Material itemType;
Material placeType; Material placeType;
Sound sound; Sound sound;
Location groundLoc = null;
boolean nether = bot.getBukkitEntity().getWorld().getEnvironment() == World.Environment.NETHER;
double yPos = bot.getBukkitEntity().getLocation().getY();
if (bot.getBukkitEntity().getWorld().getEnvironment() == World.Environment.NETHER) { if (nether) {
itemType = Material.TWISTING_VINES; itemType = Material.TWISTING_VINES;
sound = Sound.BLOCK_WEEPING_VINES_PLACE; sound = Sound.BLOCK_WEEPING_VINES_PLACE;
placeType = itemType; placeType = itemType;
for (Block block : event.getStandingOn()) {
if (LegacyMats.canPlaceTwistingVines(block)) {
groundLoc = block.getLocation();
break;
}
}
} else { } else {
itemType = Material.WATER_BUCKET; itemType = Material.WATER_BUCKET;
sound = Sound.ITEM_BUCKET_EMPTY; sound = Sound.ITEM_BUCKET_EMPTY;
placeType = Material.WATER; placeType = Material.WATER;
for (Block block : event.getStandingOn()) {
if (LegacyMats.canPlaceWater(block, yPos)) {
groundLoc = block.getLocation();
break;
}
}
} }
Location loc = bot.getLocation(); if (groundLoc == null) return;
if (!loc.clone().add(0, -1, 0).getBlock().getType().isSolid()) return; Location loc = !LegacyMats.shouldReplace(groundLoc.getBlock(), yPos, nether) ? groundLoc.add(0, 1, 0) : groundLoc;
boolean waterloggable = loc.getBlock().getBlockData() instanceof Waterlogged;
boolean waterlogged = waterloggable && ((Waterlogged)loc.getBlock().getBlockData()).isWaterlogged();
event.setCancelled(true); event.setCancelled(true);
if (loc.getBlock().getType() != placeType) { if (loc.getBlock().getType() != placeType && !waterlogged) {
bot.punch(); bot.punch();
loc.getBlock().setType(placeType); if (waterloggable) {
Waterlogged data = (Waterlogged)loc.getBlock().getBlockData();
data.setWaterlogged(true);
loc.getBlock().setBlockData(data);
} else
loc.getBlock().setType(placeType);
world.playSound(loc, sound, 1, 1); world.playSound(loc, sound, 1, 1);
if (itemType == Material.WATER_BUCKET) { if (itemType == Material.WATER_BUCKET) {
@@ -365,11 +390,18 @@ public class LegacyAgent extends Agent {
scheduler.runTaskLater(plugin, () -> { scheduler.runTaskLater(plugin, () -> {
Block block = loc.getBlock(); Block block = loc.getBlock();
if (block.getType() == Material.WATER) { boolean waterloggedNow = block.getBlockData() instanceof Waterlogged
&& ((Waterlogged)block.getBlockData()).isWaterlogged();
if (block.getType() == Material.WATER || waterloggedNow) {
bot.look(BlockFace.DOWN); bot.look(BlockFace.DOWN);
bot.setItem(new ItemStack(Material.WATER_BUCKET)); bot.setItem(new ItemStack(Material.WATER_BUCKET));
world.playSound(loc, Sound.ITEM_BUCKET_FILL, 1, 1); world.playSound(loc, Sound.ITEM_BUCKET_FILL, 1, 1);
block.setType(Material.AIR); if (waterloggedNow) {
Waterlogged data = (Waterlogged)loc.getBlock().getBlockData();
data.setWaterlogged(false);
loc.getBlock().setBlockData(data);
} else
block.setType(Material.AIR);
} }
}, 5); }, 5);
} }

View File

@@ -1,8 +1,12 @@
package net.nuggetmc.tplus.api.agent.legacyagent; package net.nuggetmc.tplus.api.agent.legacyagent;
import org.bukkit.Axis;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.Bisected;
import org.bukkit.block.data.Waterlogged;
import org.bukkit.block.data.type.*; import org.bukkit.block.data.type.*;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import java.util.ArrayList; import java.util.ArrayList;
@@ -286,4 +290,179 @@ public class LegacyMats {
&& !exclusions.contains(m) && !m.isLegacy()).toList()); && !exclusions.contains(m) && !m.isLegacy()).toList());
return materials; return materials;
} }
public static boolean canPlaceWater(Block block, double entityYPos) {
if (block.getType().isSolid()) {
if (block.getType() == Material.CHAIN && ((Chain)block.getBlockData()).getAxis() == Axis.Y
&& !((Chain)block.getBlockData()).isWaterlogged())
return false;
if ((block.getType().data == Leaves.class || block.getType() == Material.MANGROVE_ROOTS
|| block.getType() == Material.IRON_BARS || block.getType().name().endsWith("GLASS_PANE"))
&& !((Waterlogged)block.getBlockData()).isWaterlogged())
return false;
if (block.getType().data == Slab.class && ((Slab)block.getBlockData()).getType() == Slab.Type.TOP
&& !((Slab)block.getBlockData()).isWaterlogged())
return false;
if (block.getType().data == Stairs.class && ((Stairs)block.getBlockData()).getHalf() == Bisected.Half.TOP
&& !((Stairs)block.getBlockData()).isWaterlogged())
return false;
if (block.getType().data == Stairs.class && ((Stairs)block.getBlockData()).getHalf() == Bisected.Half.BOTTOM
&& !((Stairs)block.getBlockData()).isWaterlogged() && (int)entityYPos != block.getLocation().getBlockY())
return false;
if ((block.getType().data == Fence.class || block.getType().data == Wall.class)
&& !((Waterlogged)block.getBlockData()).isWaterlogged())
return false;
if (block.getType() == Material.LIGHTNING_ROD && !((LightningRod)block.getBlockData()).isWaterlogged()
&& (((LightningRod)block.getBlockData()).getFacing() == BlockFace.UP || ((LightningRod)block.getBlockData()).getFacing() == BlockFace.DOWN))
return false;
return true;
} else {
if (block.getType().name().endsWith("_CARPET"))
return true;
if (block.getType().data == Candle.class)
return true;
if (block.getType().name().startsWith("POTTED_"))
return true;
if ((block.getType().name().endsWith("_HEAD") || block.getType().name().endsWith("_SKULL"))
&& !block.getType().name().equals("PISTON_HEAD"))
return true;
switch (block.getType()) {
case SNOW:
case AZALEA:
case FLOWERING_AZALEA:
case CHORUS_FLOWER:
case CHORUS_PLANT:
case COCOA:
case LILY_PAD:
case SEA_PICKLE:
case END_ROD:
case FLOWER_POT:
case SCAFFOLDING:
return true;
default:
break;
}
}
return false;
}
public static boolean canPlaceTwistingVines(Block block) {
if (block.getType().isSolid()) {
if (block.getType().data == Leaves.class)
return false;
if (block.getType().name().endsWith("_CORAL_FAN") || block.getType().name().endsWith("_CORAL")
|| block.getType().name().endsWith("_CORAL_WALL_FAN"))
return false;
if (block.getType().name().endsWith("GLASS_PANE"))
return false;
if (block.getType().data == Slab.class && ((Slab)block.getBlockData()).getType() == Slab.Type.BOTTOM)
return false;
if (block.getType().data == Stairs.class && ((Stairs)block.getBlockData()).getHalf() == Bisected.Half.BOTTOM)
return false;
if (block.getType().data == Fence.class || block.getType().data == Wall.class)
return false;
if (block.getType().name().endsWith("_BANNER"))
return false;
if (block.getType().name().endsWith("_WALL_BANNER"))
return false;
if (block.getType().data == Bed.class)
return false;
if (block.getType().name().endsWith("CANDLE_CAKE"))
return false;
if (block.getType().data == Door.class)
return false;
if (block.getType().data == Gate.class)
return false;
switch (block.getType()) {
case POINTED_DRIPSTONE:
case SMALL_AMETHYST_BUD:
case MEDIUM_AMETHYST_BUD:
case LARGE_AMETHYST_BUD:
case AMETHYST_CLUSTER:
case BAMBOO:
case CACTUS:
case DRAGON_EGG:
case TURTLE_EGG:
case CHAIN:
case IRON_BARS:
case LANTERN:
case SOUL_LANTERN:
case ANVIL:
case BREWING_STAND:
case CHEST:
case ENDER_CHEST:
case TRAPPED_CHEST:
case ENCHANTING_TABLE:
case GRINDSTONE:
case LECTERN:
case STONECUTTER:
case BELL:
case CAKE:
case CAMPFIRE:
case SOUL_CAMPFIRE:
case CAULDRON:
case COMPOSTER:
case CONDUIT:
case END_PORTAL_FRAME:
case FARMLAND:
case LADDER:
case DAYLIGHT_DETECTOR:
case HOPPER:
case LIGHTNING_ROD:
return false;
default:
}
return true;
} else {
switch (block.getType()) {
case CHORUS_FLOWER:
case SCAFFOLDING:
case AZALEA:
case FLOWERING_AZALEA:
return true;
case SNOW:
return ((Snow)block.getBlockData()).getLayers() == 1 || ((Snow)block.getBlockData()).getLayers() == 8;
default:
}
}
return false;
}
public static boolean shouldReplace(Block block, double entityYPos, boolean nether) {
if ((int)entityYPos != block.getLocation().getBlockY())
return false;
if (nether) {
return false;
} else {
if (block.getType().name().endsWith("_CORAL_FAN") || block.getType().name().endsWith("_CORAL")
|| block.getType().name().endsWith("_CORAL_WALL_FAN"))
return true;
if (block.getType().data == Slab.class && ((Slab)block.getBlockData()).getType() == Slab.Type.BOTTOM)
return true;
if (block.getType().data == Stairs.class && !((Stairs)block.getBlockData()).isWaterlogged())
return true;
if (block.getType().data == Candle.class)
return true;
switch (block.getType()) {
case POINTED_DRIPSTONE:
case SMALL_AMETHYST_BUD:
case MEDIUM_AMETHYST_BUD:
case LARGE_AMETHYST_BUD:
case AMETHYST_CLUSTER:
case SEA_PICKLE:
case LANTERN:
case SOUL_LANTERN:
case CHEST:
case ENDER_CHEST:
case TRAPPED_CHEST:
case CAMPFIRE:
case SOUL_CAMPFIRE:
case CONDUIT:
case LIGHTNING_ROD:
return true;
default:
}
return false;
}
}
} }

View File

@@ -16,9 +16,13 @@ public class BotUtils {
Material.WATER, Material.WATER,
Material.LAVA, Material.LAVA,
Material.TWISTING_VINES, Material.TWISTING_VINES,
Material.TWISTING_VINES_PLANT,
Material.WEEPING_VINES,
Material.WEEPING_VINES_PLANT,
Material.SWEET_BERRY_BUSH, Material.SWEET_BERRY_BUSH,
Material.POWDER_SNOW, Material.POWDER_SNOW,
Material.COBWEB Material.COBWEB,
Material.VINE
)); ));
public static UUID randomSteveUUID() { public static UUID randomSteveUUID() {

View File

@@ -628,7 +628,9 @@ public class Bot extends ServerPlayer implements Terminator {
private boolean canStandOn(Material mat) { private boolean canStandOn(Material mat) {
if(mat == Material.END_ROD || mat == Material.FLOWER_POT || mat == Material.REPEATER || mat == Material.COMPARATOR if(mat == Material.END_ROD || mat == Material.FLOWER_POT || mat == Material.REPEATER || mat == Material.COMPARATOR
|| mat == Material.SNOW || mat == Material.LADDER || mat == Material.VINE || mat == Material.SCAFFOLDING || mat == Material.SNOW || mat == Material.LADDER || mat == Material.VINE || mat == Material.SCAFFOLDING
|| mat == Material.AZALEA || mat == Material.FLOWERING_AZALEA || mat == Material.BIG_DRIPLEAF) || mat == Material.AZALEA || mat == Material.FLOWERING_AZALEA || mat == Material.BIG_DRIPLEAF
|| mat == Material.CHORUS_FLOWER || mat == Material.CHORUS_PLANT || mat == Material.COCOA
|| mat == Material.LILY_PAD || mat == Material.SEA_PICKLE)
return true; return true;
if(mat.name().endsWith("_CARPET")) if(mat.name().endsWith("_CARPET"))