Added possibility for scripts to override certain pickup checks. Closes #853
This commit is contained in:
parent
5342c4daa5
commit
eab2ef67b7
|
|
@ -89,7 +89,7 @@ public class PickupHandler {
|
||||||
|
|
||||||
public static boolean tryPickUpBlock(ServerPlayer player, BlockPos pos, Level level, @Nullable BiFunction<BlockState, BlockPos, Boolean> pickupCallback)
|
public static boolean tryPickUpBlock(ServerPlayer player, BlockPos pos, Level level, @Nullable BiFunction<BlockState, BlockPos, Boolean> pickupCallback)
|
||||||
{
|
{
|
||||||
if(!canCarryGeneral(player, Vec3.atCenterOf(pos)))
|
if(!canCarryGeneral(player, Vec3.atCenterOf(pos))) //Necessary
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CarryOnData carry = CarryOnDataManager.getCarryData(player);
|
CarryOnData carry = CarryOnDataManager.getCarryData(player);
|
||||||
|
|
@ -99,13 +99,16 @@ public class PickupHandler {
|
||||||
if(blockEntity != null)
|
if(blockEntity != null)
|
||||||
nbt = blockEntity.saveWithId(level.registryAccess());
|
nbt = blockEntity.saveWithId(level.registryAccess());
|
||||||
|
|
||||||
|
Optional<CarryOnScript> result = ScriptManager.inspectBlock(state, level, pos, nbt);
|
||||||
|
boolean overrideChecks = result.map(CarryOnScript::overrideChecks).orElse(false);
|
||||||
|
|
||||||
if(!ListHandler.isPermitted(state.getBlock()))
|
if(!ListHandler.isPermitted(state.getBlock()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(state.getDestroySpeed(level, pos) == -1 && !player.isCreative() && !Constants.COMMON_CONFIG.settings.pickupUnbreakableBlocks)
|
if(!overrideChecks && (state.getDestroySpeed(level, pos) == -1 && !player.isCreative() && !Constants.COMMON_CONFIG.settings.pickupUnbreakableBlocks))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(blockEntity == null && !Constants.COMMON_CONFIG.settings.pickupAllBlocks)
|
if(!overrideChecks && (blockEntity == null && !Constants.COMMON_CONFIG.settings.pickupAllBlocks))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
//Check if TE is locked
|
//Check if TE is locked
|
||||||
|
|
@ -126,7 +129,6 @@ public class PickupHandler {
|
||||||
if(!doPickup)
|
if(!doPickup)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Optional<CarryOnScript> result = ScriptManager.inspectBlock(state, level, pos, nbt);
|
|
||||||
if(result.isPresent())
|
if(result.isPresent())
|
||||||
{
|
{
|
||||||
CarryOnScript script = result.get();
|
CarryOnScript script = result.get();
|
||||||
|
|
@ -174,17 +176,20 @@ public class PickupHandler {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Optional<CarryOnScript> result = ScriptManager.inspectEntity(entity);
|
||||||
|
boolean overrideChecks = result.map(CarryOnScript::overrideChecks).orElse(false);
|
||||||
|
|
||||||
if(!ListHandler.isPermitted(entity))
|
if(!ListHandler.isPermitted(entity))
|
||||||
{
|
{
|
||||||
//We can pick up baby animals even if the grown up animal is blacklisted.
|
//We can pick up baby animals even if the grown up animal is blacklisted.
|
||||||
if(!(entity instanceof AgeableMob ageableMob && Constants.COMMON_CONFIG.settings.allowBabies && (ageableMob.getAge() < 0 || ageableMob.isBaby())))
|
if(!overrideChecks && (!(entity instanceof AgeableMob ageableMob && Constants.COMMON_CONFIG.settings.allowBabies && (ageableMob.getAge() < 0 || ageableMob.isBaby()))))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Non-Creative only guards
|
//Non-Creative only guards
|
||||||
if(!player.isCreative())
|
if(!player.isCreative())
|
||||||
{
|
{
|
||||||
if(!Constants.COMMON_CONFIG.settings.pickupHostileMobs && entity.getType().getCategory() == MobCategory.MONSTER)
|
if(!overrideChecks && (!Constants.COMMON_CONFIG.settings.pickupHostileMobs && entity.getType().getCategory() == MobCategory.MONSTER))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(Constants.COMMON_CONFIG.settings.maxEntityHeight < entity.getBbHeight() || Constants.COMMON_CONFIG.settings.maxEntityWidth < entity.getBbWidth())
|
if(Constants.COMMON_CONFIG.settings.maxEntityHeight < entity.getBbHeight() || Constants.COMMON_CONFIG.settings.maxEntityWidth < entity.getBbWidth())
|
||||||
|
|
@ -204,7 +209,6 @@ public class PickupHandler {
|
||||||
|
|
||||||
CarryOnData carry = CarryOnDataManager.getCarryData(player);
|
CarryOnData carry = CarryOnDataManager.getCarryData(player);
|
||||||
|
|
||||||
Optional<CarryOnScript> result = ScriptManager.inspectEntity(entity);
|
|
||||||
if(result.isPresent())
|
if(result.isPresent())
|
||||||
{
|
{
|
||||||
CarryOnScript script = result.get();
|
CarryOnScript script = result.get();
|
||||||
|
|
|
||||||
|
|
@ -39,12 +39,13 @@ public record CarryOnScript(
|
||||||
ScriptObject scriptObject,
|
ScriptObject scriptObject,
|
||||||
ScriptConditions scriptConditions,
|
ScriptConditions scriptConditions,
|
||||||
ScriptRender scriptRender,
|
ScriptRender scriptRender,
|
||||||
ScriptEffects scriptEffects)
|
ScriptEffects scriptEffects,
|
||||||
|
boolean overrideChecks)
|
||||||
{
|
{
|
||||||
|
|
||||||
public boolean isValid()
|
public boolean isValid()
|
||||||
{
|
{
|
||||||
return (isBlock() ^ isEntity()) && (scriptConditions != ScriptConditions.EMPTY || scriptRender != ScriptRender.EMPTY || scriptEffects != ScriptEffects.EMPTY);
|
return (isBlock() ^ isEntity()) && (scriptConditions != ScriptConditions.EMPTY || scriptRender != ScriptRender.EMPTY || scriptEffects != ScriptEffects.EMPTY || overrideChecks);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isBlock()
|
public boolean isBlock()
|
||||||
|
|
@ -63,7 +64,8 @@ public record CarryOnScript(
|
||||||
ScriptObject.CODEC.fieldOf("object").forGetter(CarryOnScript::scriptObject),
|
ScriptObject.CODEC.fieldOf("object").forGetter(CarryOnScript::scriptObject),
|
||||||
ScriptConditions.CODEC.optionalFieldOf("conditions", ScriptConditions.EMPTY).forGetter(CarryOnScript::scriptConditions),
|
ScriptConditions.CODEC.optionalFieldOf("conditions", ScriptConditions.EMPTY).forGetter(CarryOnScript::scriptConditions),
|
||||||
ScriptRender.CODEC.optionalFieldOf("render", ScriptRender.EMPTY).forGetter(CarryOnScript::scriptRender),
|
ScriptRender.CODEC.optionalFieldOf("render", ScriptRender.EMPTY).forGetter(CarryOnScript::scriptRender),
|
||||||
ScriptEffects.CODEC.optionalFieldOf("effects", ScriptEffects.EMPTY).forGetter(CarryOnScript::scriptEffects)
|
ScriptEffects.CODEC.optionalFieldOf("effects", ScriptEffects.EMPTY).forGetter(CarryOnScript::scriptEffects),
|
||||||
|
Codec.BOOL.optionalFieldOf("override_checks", false).forGetter(CarryOnScript::overrideChecks)
|
||||||
).apply(instance, CarryOnScript::new)
|
).apply(instance, CarryOnScript::new)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ public class ScriptReloadListener extends SimpleJsonResourceReloadListener
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
Collections.sort(ScriptManager.SCRIPTS, (s1, s2) -> Long.compare(s2.priority(), s1.priority()));
|
ScriptManager.SCRIPTS.sort((s1, s2) -> Long.compare(s2.priority(), s1.priority()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void syncScriptsWithClient(ServerPlayer player)
|
public static void syncScriptsWithClient(ServerPlayer player)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user