mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-02-07 22:16:44 +01:00
Properly set players' race when joining. Should fix players getting stuck as humans when joining a server they played on before the mod was installed.
This commit is contained in:
parent
fef8b05fea
commit
5f1e6c24f0
14 changed files with 31 additions and 40 deletions
|
@ -23,7 +23,7 @@ import net.minecraft.registry.Registry;
|
||||||
import net.minecraft.registry.RegistryKey;
|
import net.minecraft.registry.RegistryKey;
|
||||||
|
|
||||||
public final class Race implements Affine {
|
public final class Race implements Affine {
|
||||||
public static final String DEFAULT_ID = "unicopia:human";
|
public static final String DEFAULT_ID = "unicopia:unset";
|
||||||
public static final Registry<Race> REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race"), DEFAULT_ID);
|
public static final Registry<Race> REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race"), DEFAULT_ID);
|
||||||
public static final RegistryKey<? extends Registry<Race>> REGISTRY_KEY = REGISTRY.getKey();
|
public static final RegistryKey<? extends Registry<Race>> REGISTRY_KEY = REGISTRY.getKey();
|
||||||
private static final DynamicCommandExceptionType UNKNOWN_RACE_EXCEPTION = new DynamicCommandExceptionType(id -> Text.translatable("race.unknown", id));
|
private static final DynamicCommandExceptionType UNKNOWN_RACE_EXCEPTION = new DynamicCommandExceptionType(id -> Text.translatable("race.unknown", id));
|
||||||
|
@ -44,6 +44,7 @@ public final class Race implements Affine {
|
||||||
* The default, unset race.
|
* The default, unset race.
|
||||||
* This is used if there are no other races.
|
* This is used if there are no other races.
|
||||||
*/
|
*/
|
||||||
|
public static final Race UNSET = register("unset", false, FlightType.NONE, false);
|
||||||
public static final Race HUMAN = register("human", false, FlightType.NONE, false);
|
public static final Race HUMAN = register("human", false, FlightType.NONE, false);
|
||||||
public static final Race EARTH = register("earth", false, FlightType.NONE, true);
|
public static final Race EARTH = register("earth", false, FlightType.NONE, true);
|
||||||
public static final Race UNICORN = register("unicorn", true, FlightType.NONE, false);
|
public static final Race UNICORN = register("unicorn", true, FlightType.NONE, false);
|
||||||
|
@ -70,15 +71,19 @@ public final class Race implements Affine {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasIronGut() {
|
public boolean hasIronGut() {
|
||||||
return isUsable() && this != CHANGELING;
|
return !isHuman() && this != CHANGELING;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isUsable() {
|
public boolean isUnset() {
|
||||||
return !isDefault();
|
return this == UNSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDefault() {
|
public boolean isEquine() {
|
||||||
return this == HUMAN;
|
return !isHuman();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isHuman() {
|
||||||
|
return this == UNSET || this == HUMAN;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isOp() {
|
public boolean isOp() {
|
||||||
|
@ -135,7 +140,7 @@ public final class Race implements Affine {
|
||||||
|
|
||||||
Set<String> whitelist = Unicopia.getConfig().speciesWhiteList.get();
|
Set<String> whitelist = Unicopia.getConfig().speciesWhiteList.get();
|
||||||
|
|
||||||
return isDefault()
|
return isUnset()
|
||||||
|| whitelist.isEmpty()
|
|| whitelist.isEmpty()
|
||||||
|| whitelist.contains(getId().toString());
|
|| whitelist.contains(getId().toString());
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ public class EarthPonyKickAbility implements Ability<Pos> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getCostEstimate(Pony player) {
|
public double getCostEstimate(Pony player) {
|
||||||
double distance = MineLPDelegate.getInstance().getPlayerPonyRace(player.asEntity()).isDefault() ? 6 : -6;
|
double distance = MineLPDelegate.getInstance().getPlayerPonyRace(player.asEntity()).isHuman() ? 6 : -6;
|
||||||
|
|
||||||
return TraceHelper.findBlock(player.asEntity(), distance, 1)
|
return TraceHelper.findBlock(player.asEntity(), distance, 1)
|
||||||
.filter(pos -> TreeType.at(pos, player.asWorld()) != TreeType.NONE)
|
.filter(pos -> TreeType.at(pos, player.asWorld()) != TreeType.NONE)
|
||||||
|
@ -113,13 +113,13 @@ public class EarthPonyKickAbility implements Ability<Pos> {
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getKickDirection(Pony player) {
|
private int getKickDirection(Pony player) {
|
||||||
return MineLPDelegate.getInstance().getPlayerPonyRace(player.asEntity()).isDefault() ? 1 : -1;
|
return MineLPDelegate.getInstance().getPlayerPonyRace(player.asEntity()).isHuman() ? 1 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Pos getDefaultKickLocation(Pony player) {
|
private Pos getDefaultKickLocation(Pony player) {
|
||||||
Vec3d kickVector = player.asEntity().getRotationVector().multiply(1, 0, 1);
|
Vec3d kickVector = player.asEntity().getRotationVector().multiply(1, 0, 1);
|
||||||
|
|
||||||
if (!MineLPDelegate.getInstance().getPlayerPonyRace(player.asEntity()).isDefault()) {
|
if (MineLPDelegate.getInstance().getPlayerPonyRace(player.asEntity()).isEquine()) {
|
||||||
kickVector = kickVector.rotateY((float)Math.PI);
|
kickVector = kickVector.rotateY((float)Math.PI);
|
||||||
}
|
}
|
||||||
return new Pos(new BlockPos(player.getOriginVector().add(kickVector)));
|
return new Pos(new BlockPos(player.getOriginVector().add(kickVector)));
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class UnicopiaClient implements ClientModInitializer {
|
||||||
&& MinecraftClient.getInstance().player != null) {
|
&& MinecraftClient.getInstance().player != null) {
|
||||||
Race race = MineLPDelegate.getInstance().getPlayerPonyRace();
|
Race race = MineLPDelegate.getInstance().getPlayerPonyRace();
|
||||||
|
|
||||||
if (!race.isDefault()) {
|
if (race.isEquine()) {
|
||||||
return race;
|
return race;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,7 +89,7 @@ public class LanSettingsScreen extends GameGui {
|
||||||
|
|
||||||
if (whitelist.isEmpty() && forceShowWhitelist) {
|
if (whitelist.isEmpty() && forceShowWhitelist) {
|
||||||
for (Race r : Race.REGISTRY) {
|
for (Race r : Race.REGISTRY) {
|
||||||
if (!r.isDefault()) {
|
if (!r.isUnset()) {
|
||||||
whitelist.add(r.getId().toString());
|
whitelist.add(r.getId().toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -113,7 +113,7 @@ public class LanSettingsScreen extends GameGui {
|
||||||
WHITELIST_GRID_PACKER.start();
|
WHITELIST_GRID_PACKER.start();
|
||||||
|
|
||||||
for (Race race : Race.REGISTRY) {
|
for (Race race : Race.REGISTRY) {
|
||||||
if (!race.isDefault()) {
|
if (!race.isUnset()) {
|
||||||
Bounds bound = WHITELIST_GRID_PACKER.next();
|
Bounds bound = WHITELIST_GRID_PACKER.next();
|
||||||
|
|
||||||
Button button = content.addButton(new Toggle(LEFT + bound.left + 10, row + bound.top, whitelist.contains(race.getId().toString())))
|
Button button = content.addButton(new Toggle(LEFT + bound.left + 10, row + bound.top, whitelist.contains(race.getId().toString())))
|
||||||
|
|
|
@ -49,7 +49,7 @@ public class TribeSelectionScreen extends GameGui implements HidesHud {
|
||||||
|
|
||||||
final int itemWidth = 70 + 10;
|
final int itemWidth = 70 + 10;
|
||||||
|
|
||||||
List<Race> options = Race.REGISTRY.stream().filter(race -> !race.isDefault() && !race.isOp()).toList();
|
List<Race> options = Race.REGISTRY.stream().filter(race -> !race.isHuman() && !race.isOp()).toList();
|
||||||
|
|
||||||
int columns = Math.min(width / itemWidth, options.size());
|
int columns = Math.min(width / itemWidth, options.size());
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ import com.minelittlepony.unicopia.client.FirstPersonRendererOverrides.ArmRender
|
||||||
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.model.ModelPart;
|
import net.minecraft.client.model.ModelPart;
|
||||||
import net.minecraft.client.render.VertexConsumer;
|
|
||||||
import net.minecraft.client.render.VertexConsumerProvider;
|
import net.minecraft.client.render.VertexConsumerProvider;
|
||||||
import net.minecraft.client.render.entity.feature.FeatureRenderer;
|
import net.minecraft.client.render.entity.feature.FeatureRenderer;
|
||||||
import net.minecraft.client.render.entity.feature.FeatureRendererContext;
|
import net.minecraft.client.render.entity.feature.FeatureRendererContext;
|
||||||
|
|
|
@ -91,7 +91,7 @@ public class BraceletFeatureRenderer<E extends LivingEntity> implements Accessor
|
||||||
|
|
||||||
boolean glowing = ((GlowableItem)item.getItem()).isGlowing(item);
|
boolean glowing = ((GlowableItem)item.getItem()).isGlowing(item);
|
||||||
|
|
||||||
if (!MineLPDelegate.getInstance().getPlayerPonyRace((ClientPlayerEntity)entity).isDefault()) {
|
if (MineLPDelegate.getInstance().getPlayerPonyRace((ClientPlayerEntity)entity).isEquine()) {
|
||||||
stack.translate(side == Arm.LEFT ? 0.06 : -0.06, 0.3, 0);
|
stack.translate(side == Arm.LEFT ? 0.06 : -0.06, 0.3, 0);
|
||||||
} else {
|
} else {
|
||||||
stack.translate(0, -0.1, 0);
|
stack.translate(0, -0.1, 0);
|
||||||
|
|
|
@ -20,11 +20,7 @@ import net.minecraft.util.Arm;
|
||||||
import net.minecraft.util.math.*;
|
import net.minecraft.util.math.*;
|
||||||
|
|
||||||
public class HeldEntityFeatureRenderer<E extends LivingEntity> implements AccessoryFeatureRenderer.Feature<E> {
|
public class HeldEntityFeatureRenderer<E extends LivingEntity> implements AccessoryFeatureRenderer.Feature<E> {
|
||||||
|
|
||||||
private final FeatureRendererContext<E, ? extends BipedEntityModel<E>> context;
|
|
||||||
|
|
||||||
public HeldEntityFeatureRenderer(FeatureRendererContext<E, ? extends BipedEntityModel<E>> context) {
|
public HeldEntityFeatureRenderer(FeatureRendererContext<E, ? extends BipedEntityModel<E>> context) {
|
||||||
this.context = context;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -106,7 +102,7 @@ public class HeldEntityFeatureRenderer<E extends LivingEntity> implements Access
|
||||||
float passengerHeight = passenger.asEntity().getHeight() / 2F;
|
float passengerHeight = passenger.asEntity().getHeight() / 2F;
|
||||||
float carrierHeight = entity.asEntity().getHeight() / 5F;
|
float carrierHeight = entity.asEntity().getHeight() / 5F;
|
||||||
|
|
||||||
if (entity instanceof Pony pony && !MineLPDelegate.getInstance().getPlayerPonyRace(pony.asEntity()).isDefault() && pony.getPhysics().isFlying()) {
|
if (entity instanceof Pony pony && MineLPDelegate.getInstance().getPlayerPonyRace(pony.asEntity()).isEquine() && pony.getPhysics().isFlying()) {
|
||||||
return new Vec3d(0,
|
return new Vec3d(0,
|
||||||
-passenger.asEntity().getHeight() - passengerHeight,
|
-passenger.asEntity().getHeight() - passengerHeight,
|
||||||
0
|
0
|
||||||
|
|
|
@ -29,7 +29,7 @@ public class PlayerPoser {
|
||||||
Pony pony = Pony.of(player);
|
Pony pony = Pony.of(player);
|
||||||
float progress = pony.getAnimationProgress(MinecraftClient.getInstance().getTickDelta());
|
float progress = pony.getAnimationProgress(MinecraftClient.getInstance().getTickDelta());
|
||||||
Animation animation = pony.getAnimation();
|
Animation animation = pony.getAnimation();
|
||||||
boolean isPony = !MineLPDelegate.getInstance().getPlayerPonyRace(player).isDefault();
|
boolean isPony = MineLPDelegate.getInstance().getPlayerPonyRace(player).isEquine();
|
||||||
|
|
||||||
ItemStack glasses = GlassesItem.getForEntity(player);
|
ItemStack glasses = GlassesItem.getForEntity(player);
|
||||||
|
|
||||||
|
|
|
@ -89,7 +89,7 @@ class SpeciesCommand {
|
||||||
|
|
||||||
boolean first = true;
|
boolean first = true;
|
||||||
for (Race i : Race.REGISTRY) {
|
for (Race i : Race.REGISTRY) {
|
||||||
if (!i.isDefault() && i.isPermitted(player)) {
|
if (!i.isUnset() && i.isPermitted(player)) {
|
||||||
message.append(Text.literal((!first ? "\n" : "") + " - "));
|
message.append(Text.literal((!first ? "\n" : "") + " - "));
|
||||||
message.append(i.getDisplayName());
|
message.append(i.getDisplayName());
|
||||||
first = false;
|
first = false;
|
||||||
|
|
|
@ -303,7 +303,7 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
|
||||||
entity.setVelocity(velocity.toImmutable());
|
entity.setVelocity(velocity.toImmutable());
|
||||||
|
|
||||||
if (isFlying() && !entity.isFallFlying() && !pony.isHanging() && pony.isClient()) {
|
if (isFlying() && !entity.isFallFlying() && !pony.isHanging() && pony.isClient()) {
|
||||||
if (MineLPDelegate.getInstance().getPlayerPonyRace(entity).isDefault() && getHorizontalMotion() > 0.03) {
|
if (MineLPDelegate.getInstance().getPlayerPonyRace(entity).isEquine() && getHorizontalMotion() > 0.03) {
|
||||||
float pitch = ((LivingEntityDuck)entity).getLeaningPitch();
|
float pitch = ((LivingEntityDuck)entity).getLeaningPitch();
|
||||||
if (pitch < 1) {
|
if (pitch < 1) {
|
||||||
if (pitch < 0.9F) {
|
if (pitch < 0.9F) {
|
||||||
|
|
|
@ -82,7 +82,6 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
private final Interpolator interpolator = new LinearInterpolator();
|
private final Interpolator interpolator = new LinearInterpolator();
|
||||||
|
|
||||||
private boolean dirty;
|
private boolean dirty;
|
||||||
private boolean speciesPersisted;
|
|
||||||
|
|
||||||
private int ticksHanging;
|
private int ticksHanging;
|
||||||
|
|
||||||
|
@ -213,10 +212,6 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
return corruption;
|
return corruption;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSpeciesPersisted() {
|
|
||||||
return speciesPersisted;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSunImmune() {
|
public boolean isSunImmune() {
|
||||||
return ticksSunImmunity > 0;
|
return ticksSunImmunity > 0;
|
||||||
}
|
}
|
||||||
|
@ -602,7 +597,6 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
@Override
|
@Override
|
||||||
public void fromSynchronizedNbt(NbtCompound compound) {
|
public void fromSynchronizedNbt(NbtCompound compound) {
|
||||||
super.fromSynchronizedNbt(compound);
|
super.fromSynchronizedNbt(compound);
|
||||||
speciesPersisted = true;
|
|
||||||
setSpecies(Race.fromName(compound.getString("playerSpecies"), Race.HUMAN));
|
setSpecies(Race.fromName(compound.getString("playerSpecies"), Race.HUMAN));
|
||||||
powers.fromNBT(compound.getCompound("powers"));
|
powers.fromNBT(compound.getCompound("powers"));
|
||||||
gravity.fromNBT(compound.getCompound("gravity"));
|
gravity.fromNBT(compound.getCompound("gravity"));
|
||||||
|
@ -627,7 +621,6 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void copyFrom(Pony oldPlayer) {
|
public void copyFrom(Pony oldPlayer) {
|
||||||
speciesPersisted = true;
|
|
||||||
if (!oldPlayer.asEntity().isRemoved()) {
|
if (!oldPlayer.asEntity().isRemoved()) {
|
||||||
oldPlayer.getSpellSlot().stream(true).forEach(getSpellSlot()::put);
|
oldPlayer.getSpellSlot().stream(true).forEach(getSpellSlot()::put);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -33,16 +33,16 @@ public interface Channel {
|
||||||
static void bootstrap() {
|
static void bootstrap() {
|
||||||
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> {
|
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> {
|
||||||
Pony pony = Pony.of(handler.player);
|
Pony pony = Pony.of(handler.player);
|
||||||
if (!pony.isSpeciesPersisted()) {
|
if (pony.getActualSpecies() == Race.UNSET) {
|
||||||
Race race = WorldTribeManager.forWorld(handler.player.getWorld()).getDefaultRace();
|
Race race = WorldTribeManager.forWorld(handler.player.getWorld()).getDefaultRace();
|
||||||
if (!race.isPermitted(handler.player)) {
|
if (!race.isPermitted(handler.player)) {
|
||||||
race = Race.HUMAN;
|
race = Race.UNSET;
|
||||||
}
|
}
|
||||||
if (race.isUsable()) {
|
if (race.isUnset()) {
|
||||||
|
sender.sendPacket(SERVER_SELECT_TRIBE.id(), new MsgTribeSelect(Race.allPermitted(handler.player)).toBuffer());
|
||||||
|
} else {
|
||||||
pony.setSpecies(race);
|
pony.setSpecies(race);
|
||||||
Unicopia.LOGGER.info("Setting {}'s race to {} due to host setting", handler.player.getDisplayName().getString(), Race.REGISTRY.getId(race).toString());
|
Unicopia.LOGGER.info("Setting {}'s race to {} due to host setting", handler.player.getDisplayName().getString(), Race.REGISTRY.getId(race).toString());
|
||||||
} else {
|
|
||||||
sender.sendPacket(SERVER_SELECT_TRIBE.id(), new MsgTribeSelect(Race.allPermitted(handler.player)).toBuffer());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sender.sendPacket(SERVER_RESOURCES_SEND.id(), new MsgServerResources().toBuffer());
|
sender.sendPacket(SERVER_RESOURCES_SEND.id(), new MsgServerResources().toBuffer());
|
||||||
|
|
|
@ -33,10 +33,8 @@ public record MsgRequestSpeciesChange (
|
||||||
public void handle(ServerPlayerEntity sender) {
|
public void handle(ServerPlayerEntity sender) {
|
||||||
Pony player = Pony.of(sender);
|
Pony player = Pony.of(sender);
|
||||||
|
|
||||||
Race worldDefaultRace = WorldTribeManager.forWorld((ServerWorld)player.asWorld()).getDefaultRace();
|
if (force || player.getActualSpecies().isUnset()) {
|
||||||
|
player.setSpecies(newRace.isPermitted(sender) ? newRace : WorldTribeManager.forWorld((ServerWorld)player.asWorld()).getDefaultRace());
|
||||||
if (force || player.getActualSpecies().isDefault() || (player.getActualSpecies() == worldDefaultRace && !player.isSpeciesPersisted())) {
|
|
||||||
player.setSpecies(newRace.isPermitted(sender) ? newRace : worldDefaultRace);
|
|
||||||
|
|
||||||
if (force) {
|
if (force) {
|
||||||
player.onSpawn();
|
player.onSpawn();
|
||||||
|
|
Loading…
Reference in a new issue