9
0
mirror of https://github.com/WiIIiam278/HuskSync.git synced 2025-12-20 23:39:23 +00:00

fix: attribute syncing setting bad base value

This commit is contained in:
William
2024-09-05 17:07:50 +01:00
parent 1604338498
commit e191713bdc
3 changed files with 46 additions and 32 deletions

View File

@@ -483,7 +483,7 @@ public abstract class BukkitData implements Data {
} }
final int stat = p.getStatistic(id, material); final int stat = p.getStatistic(id, material);
if (stat != 0) { if (stat != 0) {
map.computeIfAbsent(id.getKey().getKey(), k -> Maps.newHashMap()) map.compute(id.getKey().getKey(), (k, v) -> v == null ? Maps.newHashMap() : v)
.put(material.getKey().getKey(), stat); .put(material.getKey().getKey(), stat);
} }
}); });
@@ -497,21 +497,21 @@ public abstract class BukkitData implements Data {
} }
final int stat = p.getStatistic(id, entity); final int stat = p.getStatistic(id, entity);
if (stat != 0) { if (stat != 0) {
map.computeIfAbsent(id.getKey().getKey(), k -> Maps.newHashMap()) map.compute(id.getKey().getKey(), (k, v) -> v == null ? Maps.newHashMap() : v)
.put(entity.getKey().getKey(), stat); .put(entity.getKey().getKey(), stat);
} }
}); });
} }
@Override @Override
public void apply(@NotNull BukkitUser user, @NotNull BukkitHuskSync plugin) { public void apply(@NotNull BukkitUser user, @NotNull BukkitHuskSync p) {
genericStatistics.forEach((id, v) -> applyStat(user, id, Statistic.Type.UNTYPED, v)); genericStatistics.forEach((k, v) -> applyStat(p, user, k, Statistic.Type.UNTYPED, v));
blockStatistics.forEach((id, m) -> m.forEach((b, v) -> applyStat(user, id, Statistic.Type.BLOCK, v, b))); blockStatistics.forEach((k, m) -> m.forEach((b, v) -> applyStat(p, user, k, Statistic.Type.BLOCK, v, b)));
itemStatistics.forEach((id, m) -> m.forEach((i, v) -> applyStat(user, id, Statistic.Type.ITEM, v, i))); itemStatistics.forEach((k, m) -> m.forEach((i, v) -> applyStat(p, user, k, Statistic.Type.ITEM, v, i)));
entityStatistics.forEach((id, m) -> m.forEach((e, v) -> applyStat(user, id, Statistic.Type.ENTITY, v, e))); entityStatistics.forEach((k, m) -> m.forEach((e, v) -> applyStat(p, user, k, Statistic.Type.ENTITY, v, e)));
} }
private void applyStat(@NotNull UserDataHolder user, @NotNull String id, private void applyStat(@NotNull HuskSync plugin, @NotNull UserDataHolder user, @NotNull String id,
@NotNull Statistic.Type type, int value, @NotNull String... key) { @NotNull Statistic.Type type, int value, @NotNull String... key) {
final Player player = ((BukkitUser) user).getPlayer(); final Player player = ((BukkitUser) user).getPlayer();
final Statistic stat = matchStatistic(id); final Statistic stat = matchStatistic(id);
@@ -525,7 +525,8 @@ public abstract class BukkitData implements Data {
case BLOCK, ITEM -> player.setStatistic(stat, Objects.requireNonNull(matchMaterial(key[0])), value); case BLOCK, ITEM -> player.setStatistic(stat, Objects.requireNonNull(matchMaterial(key[0])), value);
case ENTITY -> player.setStatistic(stat, Objects.requireNonNull(matchEntityType(key[0])), value); case ENTITY -> player.setStatistic(stat, Objects.requireNonNull(matchEntityType(key[0])), value);
} }
} catch (Throwable ignored) { } catch (Throwable a) {
plugin.log(Level.WARNING, "Failed to apply statistic " + id, a);
} }
} }
@@ -571,7 +572,7 @@ public abstract class BukkitData implements Data {
final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes(); final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes();
Registry.ATTRIBUTE.forEach(id -> { Registry.ATTRIBUTE.forEach(id -> {
final AttributeInstance instance = player.getAttribute(id); final AttributeInstance instance = player.getAttribute(id);
if (!settings.isSyncedAttribute(id.getKey().toString()) || instance == null if (settings.isIgnoredAttribute(id.getKey().toString()) || instance == null
|| Double.compare(instance.getValue(), instance.getDefaultValue()) == 0) { || Double.compare(instance.getValue(), instance.getDefaultValue()) == 0) {
return; // We don't sync attributes not marked as to be synced return; // We don't sync attributes not marked as to be synced
} }
@@ -619,8 +620,8 @@ public abstract class BukkitData implements Data {
if (instance == null) { if (instance == null) {
return; return;
} }
instance.setBaseValue(attribute == null ? instance.getDefaultValue() : attribute.baseValue());
instance.getModifiers().forEach(instance::removeModifier); instance.getModifiers().forEach(instance::removeModifier);
instance.setBaseValue(attribute == null ? instance.getValue() : attribute.baseValue());
if (attribute != null) { if (attribute != null) {
attribute.modifiers().stream() attribute.modifiers().stream()
.filter(mod -> instance.getModifiers().stream().map(AttributeModifier::getName) .filter(mod -> instance.getModifiers().stream().map(AttributeModifier::getName)
@@ -642,9 +643,13 @@ public abstract class BukkitData implements Data {
@Override @Override
public void apply(@NotNull BukkitUser user, @NotNull BukkitHuskSync plugin) throws IllegalStateException { public void apply(@NotNull BukkitUser user, @NotNull BukkitHuskSync plugin) throws IllegalStateException {
Registry.ATTRIBUTE.forEach(id -> applyAttribute( final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes();
user.getPlayer().getAttribute(id), getAttribute(id).orElse(null) Registry.ATTRIBUTE.forEach(id -> {
)); if (settings.isIgnoredAttribute(id.getKey().toString())) {
return;
}
applyAttribute(user.getPlayer().getAttribute(id), getAttribute(id).orElse(null));
});
} }
} }

View File

@@ -304,8 +304,8 @@ public class Settings {
return pat.contains("*") ? value.matches(pat.replace("*", ".*")) : pat.equals(value); return pat.contains("*") ? value.matches(pat.replace("*", ".*")) : pat.equals(value);
} }
public boolean isSyncedAttribute(@NotNull String attribute) { public boolean isIgnoredAttribute(@NotNull String attribute) {
return syncedAttributes.stream().anyMatch(wildcard -> matchesWildcard(wildcard, attribute)); return syncedAttributes.stream().noneMatch(wildcard -> matchesWildcard(wildcard, attribute));
} }
public boolean isIgnoredModifier(@NotNull String modifier) { public boolean isIgnoredModifier(@NotNull String modifier) {

View File

@@ -48,6 +48,7 @@ import net.william278.desertwell.util.ThrowingConsumer;
import net.william278.husksync.FabricHuskSync; import net.william278.husksync.FabricHuskSync;
import net.william278.husksync.HuskSync; import net.william278.husksync.HuskSync;
import net.william278.husksync.adapter.Adaptable; import net.william278.husksync.adapter.Adaptable;
import net.william278.husksync.config.Settings.SynchronizationSettings.AttributeSettings;
import net.william278.husksync.user.FabricUser; import net.william278.husksync.user.FabricUser;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -377,7 +378,7 @@ public abstract class FabricData implements Data {
// Performs a consuming function for every advancement entry registered on the server // Performs a consuming function for every advancement entry registered on the server
private static void forEachAdvancementEntry(@NotNull MinecraftServer server, private static void forEachAdvancementEntry(@NotNull MinecraftServer server,
@NotNull ThrowingConsumer<net.minecraft.advancement.AdvancementEntry> con) { @NotNull ThrowingConsumer<net.minecraft.advancement.AdvancementEntry> con) {
server.getAdvancementLoader().getAdvancements().forEach(con); server.getAdvancementLoader().getAdvancements().forEach(con);
} }
@@ -434,15 +435,15 @@ public abstract class FabricData implements Data {
try { try {
player.dismountVehicle(); player.dismountVehicle();
player.teleportTo( player.teleportTo(
new TeleportTarget( new TeleportTarget(
server.getWorld(server.getWorldRegistryKeys().stream() server.getWorld(server.getWorldRegistryKeys().stream()
.filter(key -> key.getValue().equals(Identifier.tryParse(world.name()))) .filter(key -> key.getValue().equals(Identifier.tryParse(world.name())))
.findFirst().orElseThrow( .findFirst().orElseThrow(
() -> new IllegalStateException("Invalid world") () -> new IllegalStateException("Invalid world")
)), )),
player, player,
TeleportTarget.NO_OP TeleportTarget.NO_OP
) )
); );
} catch (Throwable e) { } catch (Throwable e) {
throw new IllegalStateException("Failed to apply location", e); throw new IllegalStateException("Failed to apply location", e);
@@ -570,10 +571,11 @@ public abstract class FabricData implements Data {
@NotNull @NotNull
public static FabricData.Attributes adapt(@NotNull ServerPlayerEntity player, @NotNull HuskSync plugin) { public static FabricData.Attributes adapt(@NotNull ServerPlayerEntity player, @NotNull HuskSync plugin) {
final List<Attribute> attributes = Lists.newArrayList(); final List<Attribute> attributes = Lists.newArrayList();
final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes();
Registries.ATTRIBUTE.forEach(id -> { Registries.ATTRIBUTE.forEach(id -> {
final EntityAttributeInstance instance = player.getAttributeInstance(RegistryEntry.of(id)); final EntityAttributeInstance instance = player.getAttributeInstance(RegistryEntry.of(id));
final Identifier key = Registries.ATTRIBUTE.getId(id); final Identifier key = Registries.ATTRIBUTE.getId(id);
if (instance == null || key == null) { if (instance == null || key == null || settings.isIgnoredAttribute(key.asString())) {
return; return;
} }
final Set<Modifier> modifiers = Sets.newHashSet(); final Set<Modifier> modifiers = Sets.newHashSet();
@@ -608,10 +610,17 @@ public abstract class FabricData implements Data {
@Override @Override
protected void apply(@NotNull FabricUser user, @NotNull FabricHuskSync plugin) { protected void apply(@NotNull FabricUser user, @NotNull FabricHuskSync plugin) {
Registries.ATTRIBUTE.forEach(id -> applyAttribute( final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes();
user.getPlayer().getAttributeInstance(RegistryEntry.of(id)), Registries.ATTRIBUTE.forEach(id -> {
getAttribute(id).orElse(null) final Identifier key = Registries.ATTRIBUTE.getId(id);
)); if (key == null || settings.isIgnoredAttribute(key.toString())) {
return;
}
applyAttribute(
user.getPlayer().getAttributeInstance(RegistryEntry.of(id)),
getAttribute(id).orElse(null)
);
});
} }
@@ -620,8 +629,8 @@ public abstract class FabricData implements Data {
if (instance == null) { if (instance == null) {
return; return;
} }
instance.setBaseValue(attribute == null ? instance.getAttribute().value().getDefaultValue() : attribute.baseValue());
instance.getModifiers().forEach(instance::removeModifier); instance.getModifiers().forEach(instance::removeModifier);
instance.setBaseValue(attribute == null ? instance.getValue() : attribute.baseValue());
if (attribute != null) { if (attribute != null) {
attribute.modifiers().forEach(modifier -> instance.addTemporaryModifier(new EntityAttributeModifier( attribute.modifiers().forEach(modifier -> instance.addTemporaryModifier(new EntityAttributeModifier(
Identifier.of(modifier.uuid().toString()), Identifier.of(modifier.uuid().toString()),