Skip to content

Commit

Permalink
add: CustomName属性支持
Browse files Browse the repository at this point in the history
misc: 使EntryIndex.DISGUISE_NAME属性的值可以反映到伪装上
  • Loading branch information
MATRIX-feather committed Jan 27, 2024
1 parent 248ec03 commit ebd03b7
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import net.minecraft.nbt.CompoundTag;
import org.bukkit.ChatColor;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.Nullable;

import java.util.Map;

Expand All @@ -13,14 +14,14 @@ public class ServerDisguise implements Cloneable
public ServerDisguise(EntityType type)
{
this.type = type;
this.name = type.translationKey();

if (type == EntityType.SLIME || type == EntityType.MAGMA_CUBE)
this.compoundTag.putInt("Size", 4);
}

public EntityType type;

@Nullable
public String name;

public ChatColor glowingColor = ChatColor.WHITE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,9 @@ public DisguiseWrapper<ServerDisguise> clone()
@Override
public String getDisguiseName()
{
return instance.name;
var instanceName = instance.name;

return instanceName == null ? "" : instanceName;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
import xiamomc.morph.backends.server.renderer.utilties.WatcherUtils;
import xiamomc.morph.utilities.NbtUtils;
import xiamomc.pluginbase.Annotations.Initializer;
import xiamomc.pluginbase.Annotations.Resolved;
import xiamomc.pluginbase.Exceptions.NullDependencyException;
Expand Down Expand Up @@ -167,7 +168,16 @@ protected boolean register(SingleValue<?> singleValue)

public <X> void write(SingleValue<X> singleValue, X value)
{
write(singleValue.index(), value);
var prev = registry.getOrDefault(singleValue, null);
registry.put(singleValue, value);

if (!value.equals(prev))
dirtySingles.put(singleValue, value);

onTrackerWrite(singleValue.index(), prev, value);

if (!syncing)
sendPacketToAffectedPlayers(packetFactory.buildDiffMetaPacket(getBindingPlayer(), this));
}

public void write(int index, Object value)
Expand All @@ -179,16 +189,7 @@ public void write(int index, Object value)
if (!single.defaultValue().getClass().isInstance(value))
throw new IllegalArgumentException("Incompatable value for index '%s', excepted for '%s', but got '%s'".formatted(index, single.defaultValue().getClass(), value.getClass()));

var prev = registry.getOrDefault(single, null);
registry.put(single, value);

if (!value.equals(prev))
dirtySingles.put(single, value);

onTrackerWrite(index, prev, value);

if (!syncing)
sendPacketToAffectedPlayers(packetFactory.buildDiffMetaPacket(getBindingPlayer(), this));
write((SingleValue<Object>)single, value);
}

@Resolved(shouldSolveImmediately = true)
Expand All @@ -205,8 +206,7 @@ protected void onTrackerWrite(int index, Object oldVal, Object newVal)

public <X> X get(SingleValue<X> singleValue)
{
var ret = get(singleValue.index());
return (X)ret;
return (X)registry.getOrDefault(singleValue, singleValue.defaultValue());
}

public Object get(int index)
Expand All @@ -215,7 +215,7 @@ public Object get(int index)
if (single == null)
throw new NullDependencyException("No registry found for index '%s'".formatted(index));

return registry.get(single);
return get(single);
}

public Map<SingleValue<?>, Object> getRegistry()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;

import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
import xiamomc.morph.backends.server.renderer.network.registries.EntryIndex;
import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
import xiamomc.morph.misc.NmsRecord;

import java.util.Optional;

public class EntityWatcher extends SingleWatcher
{
@Override
Expand Down Expand Up @@ -58,4 +65,49 @@ protected void doSync()

super.doSync();
}

@Override
protected void onCustomWrite(RegistryKey<?> key, @Nullable Object oldVal, Object newVal)
{
super.onCustomWrite(key, oldVal, newVal);

if (key.equals(EntryIndex.DISGUISE_NAME))
{
var str = newVal.toString();
var component = str.isEmpty() ? null : Component.literal(str);
write(ValueIndex.BASE_ENTITY.CUSTOM_NAME, component == null ? Optional.empty() : Optional.of(component));
}
}

@Override
public void mergeFromCompound(CompoundTag nbt)
{
super.mergeFromCompound(nbt);

if (nbt.contains("CustomName"))
{
var name = nbt.getString("CustomName");
var component = Component.Serializer.fromJsonLenient(name);

if (component != null)
write(ValueIndex.BASE_ENTITY.CUSTOM_NAME, Optional.of(component));
}

if (nbt.contains("CustomNameVisible"))
{
var visible = nbt.getBoolean("CustomNameVisible");
write(ValueIndex.BASE_ENTITY.CUSTOM_NAME_VISIBLE, visible);
}
}

@Override
public void writeToCompound(CompoundTag nbt)
{
super.writeToCompound(nbt);

var customName = get(ValueIndex.BASE_ENTITY.CUSTOM_NAME);
customName.ifPresent(c -> nbt.putString("CustomNameVisible", Component.Serializer.toJson(c)));

nbt.putBoolean("CustomNameVisible", get(ValueIndex.BASE_ENTITY.CUSTOM_NAME_VISIBLE));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ private void refreshStateForPlayer(@Nullable Player player, @NotNull DisplayPara
//如果没有profile,那么随机一个并计划刷新
if (displayType == org.bukkit.entity.EntityType.PLAYER && gameProfile == null)
{
var disguiseName = watcher.get(EntryIndex.DISGUISE_NAME);
var disguiseName = watcher.get(EntryIndex.PLAYER_DISGUISE_NAME);

if (disguiseName == null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

import org.bukkit.entity.EntityType;

public record RegisterParameters(EntityType entityType, String name)
public record RegisterParameters(EntityType entityType, String playerDisguiseName)
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public void unregister(UUID uuid)
public SingleWatcher register(@NotNull Player player, RegisterParameters registerParameters)
{
var watcher = WatcherIndex.getInstance().getWatcherForType(player, registerParameters.entityType());
watcher.write(EntryIndex.DISGUISE_NAME, registerParameters.name());
watcher.write(EntryIndex.DISGUISE_NAME, registerParameters.playerDisguiseName());
register(player.getUniqueId(), watcher);

return watcher;
Expand Down

0 comments on commit ebd03b7

Please sign in to comment.