Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: correctly check for properties in thaw/snow #2976

Merged
merged 4 commits into from
Nov 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2788,7 +2788,7 @@ public int thaw(BlockVector3 position, double radius, int height)
if (setBlock(mutable, air)) {
if (y > getMinY()) {
BlockState block = getBlock(mutable2);
if (block.getStates().containsKey(snowy)) {
if (block.getBlockType().hasProperty(snowy)) {
if (setBlock(mutable2, block.with(snowy, false))) {
affected++;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,12 @@
import com.sk89q.worldedit.registry.state.BooleanProperty;
import com.sk89q.worldedit.registry.state.EnumProperty;
import com.sk89q.worldedit.registry.state.Property;
import com.sk89q.worldedit.world.block.BlockCategories;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;

import java.util.Locale;
import java.util.Map;

public class SnowSimulator implements LayerFunction {

Expand Down Expand Up @@ -120,22 +121,19 @@ public boolean apply(BlockVector3 position, int depth) throws WorldEditException
abovePosition) > 10) {
return false;
} else if (!block.getBlockType().getMaterial().isFullCube()) {
Map<Property<?>, Object> states = block.getStates();
if (states.containsKey(slab) && block.getState(slab).equalsIgnoreCase("bottom")) {
BlockType type = block.getBlockType();
if (type.hasProperty(slab) && block.getState(slab).equalsIgnoreCase("bottom")) {
return false;
} else if (states.containsKey(trapdoorOpen) && states.containsKey(trapdoor) && (block.getState(trapdoorOpen)
|| block.getState(trapdoor).equalsIgnoreCase("bottom"))) {
} else if ((type.hasProperty(trapdoorOpen) && block.getState(trapdoorOpen)) ||
(type.hasProperty(trapdoor) && block.getState(trapdoor).equalsIgnoreCase("bottom"))) {
return false;
} else if (states.containsKey(stair) && block.getState(stair).equalsIgnoreCase("bottom")) {
} else if (type.hasProperty(stair) && block.getState(stair).equalsIgnoreCase("bottom")) {
return false;
} else {
return false;
}
//FAWE end
} else if (!block.getBlockType().id().toLowerCase(Locale.ROOT).contains("ice") && block
.getBlockType()
.getMaterial()
.isTranslucent()) {
} else if (!BlockCategories.SNOW_LAYER_CAN_SURVIVE_ON.contains(block.getBlockType())) {
return false;
}

Expand All @@ -144,14 +142,14 @@ public boolean apply(BlockVector3 position, int depth) throws WorldEditException
// We've hit the highest layer (If it doesn't contain current + 2 it means it's 1 away from full)
if (!snowLayersProperty.getValues().contains(currentHeight + 2)) {
if (this.extent.setBlock(abovePosition, snowBlock)) {
if (block.getStates().containsKey(snowy)) {
if (block.getBlockType().hasProperty(snowy)) {
this.extent.setBlock(position, block.with(snowy, true));
}
this.affected++;
}
} else {
if (this.extent.setBlock(abovePosition, above.with(snowLayersProperty, currentHeight + 1))) {
if (block.getStates().containsKey(snowy)) {
if (block.getBlockType().hasProperty(snowy)) {
this.extent.setBlock(position, block.with(snowy, true));
}
this.affected++;
Expand All @@ -160,7 +158,7 @@ public boolean apply(BlockVector3 position, int depth) throws WorldEditException
return false;
}
if (this.extent.setBlock(abovePosition, snow)) {
if (block.getStates().containsKey(snowy)) {
if (block.getBlockType().hasProperty(snowy)) {
this.extent.setBlock(position, block.with(snowy, true));
}
this.affected++;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,10 @@ public void setName(final String name) {

@Override
public boolean equals(Object obj) {
if (!(obj instanceof Property)) {
if (!(obj instanceof Property property)) {
return false;
}
return getName().equals(((Property<?>) obj).getName());
return getName().equals(property.getName()) && property.getValues().equals(getValues());
}
//FAWE end
}
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ public <V> BlockState withProperties(final BlockState other) {
BlockState newState = this;
for (Property<?> prop : ot.getProperties()) {
PropertyKey key = prop.getKey();
if (blockType.hasPropertyOfType(key, prop.getClass())) {
if (blockType.hasProperty(prop)) {
newState = newState.with(key, other.getState(key));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,18 +248,14 @@ public boolean hasProperty(PropertyKey key) {
}

/**
* {@return whether this block type has a property with given key of the given type}
* {@return whether this block type has a given property}
*
* @param key the key identifying the property
* @param propertyType the expected type of the property
* @param property the expected property
* @since TODO
*/
public boolean hasPropertyOfType(PropertyKey key, Class<?> propertyType) {
int ordinal = key.getId();
Property<?> property;
return this.settings.propertiesMapArr.length > ordinal
&& (property = this.settings.propertiesMapArr[ordinal]) != null
&& property.getClass() == propertyType;
public boolean hasProperty(Property<?> property) {
int ordinal = property.getKey().getId();
return this.settings.propertiesMapArr.length > ordinal && property.equals(this.settings.propertiesMapArr[ordinal]);
}

public <V> Property<V> getProperty(PropertyKey key) {
Expand Down
Loading