Revert "Remove entity work from main extension branch for now"

This reverts commit fbaa6c1f5f.
This commit is contained in:
RednedEpic 2022-05-07 10:11:45 -05:00
parent fbaa6c1f5f
commit 2706536c7d
5 changed files with 258 additions and 3 deletions

View file

@ -0,0 +1,97 @@
/*
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.api.entity;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.api.GeyserApi;
/**
* Represents the data sent over to a client regarding
* an entity's identifier.
*/
public interface EntityIdentifier {
/**
* Gets whether this entity has a spawn egg or not.
*
* @return whether this entity has a spawn egg or not
*/
boolean hasSpawnEgg();
/**
* Gets the entity's identifier that is sent to the client.
*
* @return the entity's identifier that is sent to the client.
*/
@NonNull
String identifier();
/**
* Gets whether the entity is summonable or not.
*
* @return whether the entity is summonable or not
*/
boolean isSummonable();
@NonNull
static Builder builder() {
return GeyserApi.api().providerManager().builderProvider().provideBuilder(Builder.class);
}
interface Builder {
/**
* Sets whether the entity has a spawn egg or not.
*
* @param spawnEgg whether the entity has a spawn egg or not
* @return the builder
*/
Builder spawnEgg(boolean spawnEgg);
/**
* Sets the entity's identifier that is sent to the client.
*
* @param identifier the entity's identifier that is sent to the client
* @return the builder
*/
Builder identifier(String identifier);
/**
* Sets whether the entity is summonable or not.
*
* @param summonable whether the entity is summonable or not
* @return the builder
*/
Builder summonable(boolean summonable);
/**
* Builds the entity identifier.
*
* @return the entity identifier
*/
EntityIdentifier build();
}
}

View file

@ -0,0 +1,46 @@
/*
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.api.event.entity;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.api.connection.GeyserConnection;
import org.geysermc.geyser.api.entity.EntityIdentifier;
import org.geysermc.geyser.api.event.Event;
import java.util.List;
/**
* Called when Geyser sends a list of available entities to the
* Bedrock client. This will typically contain all the available
* entities within vanilla, but can be modified to include any custom
* entity defined through a resource pack.
*
* @param connection the {@link GeyserConnection} that is receiving the entities
* @param identifiers a mutable list of all the {@link EntityIdentifier}s
* sent to the client
*/
public record DefineEntitiesEvent(@NonNull GeyserConnection connection, @NonNull List<EntityIdentifier> identifiers) implements Event {
}

View file

@ -0,0 +1,85 @@
/*
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.entity;
import com.nukkitx.nbt.NbtMap;
import com.nukkitx.nbt.NbtMapBuilder;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.api.entity.EntityIdentifier;
import java.util.concurrent.atomic.AtomicInteger;
public record GeyserEntityIdentifier(NbtMap nbt) implements EntityIdentifier {
private static final AtomicInteger RUNTIME_ID_ALLOCATORS = new AtomicInteger(100000);
@Override
public boolean hasSpawnEgg() {
return this.nbt.getBoolean("hasspawnegg");
}
@NonNull
@Override
public String identifier() {
return this.nbt.getString("id");
}
@Override
public boolean isSummonable() {
return this.nbt.getBoolean("summonable");
}
public static class EntityIdentifierBuilder implements EntityIdentifier.Builder {
private final NbtMapBuilder nbt = NbtMap.builder();
@Override
public Builder spawnEgg(boolean spawnEgg) {
this.nbt.putBoolean("hasspawnegg", spawnEgg);
return this;
}
@Override
public Builder identifier(String identifier) {
this.nbt.putString("id", identifier);
return this;
}
@Override
public Builder summonable(boolean summonable) {
this.nbt.putBoolean("summonable", summonable);
return this;
}
@Override
public EntityIdentifier build() {
// Vanilla registry information
this.nbt.putString("bid", "");
this.nbt.putInt("rid", RUNTIME_ID_ALLOCATORS.getAndIncrement());
this.nbt.putBoolean("experimental", false);
return new GeyserEntityIdentifier(this.nbt.build());
}
}
}

View file

@ -29,8 +29,10 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.api.command.Command;
import org.geysermc.geyser.api.command.CommandSource;
import org.geysermc.geyser.api.entity.EntityIdentifier;
import org.geysermc.geyser.api.provider.BuilderProvider;
import org.geysermc.geyser.command.GeyserCommandManager;
import org.geysermc.geyser.entity.GeyserEntityIdentifier;
import org.geysermc.geyser.registry.ProviderRegistries;
import org.geysermc.geyser.registry.SimpleMappedRegistry;
@ -46,6 +48,7 @@ public class GeyserBuilderProvider extends AbstractProvider implements BuilderPr
@Override
public void registerProviders(Map<Class<?>, ProviderSupplier> providers) {
providers.put(Command.Builder.class, args -> new GeyserCommandManager.CommandBuilder<>((Class<? extends CommandSource>) args[0]));
providers.put(EntityIdentifier.Builder.class, args -> new GeyserEntityIdentifier.EntityIdentifierBuilder());
}
@Override

View file

@ -91,9 +91,12 @@ import org.geysermc.floodgate.util.BedrockData;
import org.geysermc.geyser.Constants;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.connection.GeyserConnection;
import org.geysermc.geyser.api.entity.EntityIdentifier;
import org.geysermc.geyser.api.event.entity.DefineEntitiesEvent;
import org.geysermc.geyser.api.network.RemoteServer;
import org.geysermc.geyser.command.GeyserCommandSource;
import org.geysermc.geyser.configuration.EmoteOffhandWorkaroundOption;
import org.geysermc.geyser.entity.GeyserEntityIdentifier;
import org.geysermc.geyser.entity.attribute.GeyserAttributeType;
import org.geysermc.geyser.entity.type.Entity;
import org.geysermc.geyser.entity.type.ItemFrameEntity;
@ -599,9 +602,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
biomeDefinitionListPacket.setDefinitions(Registries.BIOMES_NBT.get());
upstream.sendPacket(biomeDefinitionListPacket);
AvailableEntityIdentifiersPacket entityPacket = new AvailableEntityIdentifiersPacket();
entityPacket.setIdentifiers(Registries.BEDROCK_ENTITY_IDENTIFIERS.get());
upstream.sendPacket(entityPacket);
this.sendAvailableEntityIdentifiers();
CreativeContentPacket creativePacket = new CreativeContentPacket();
creativePacket.setContents(this.itemMappings.getCreativeItems());
@ -631,6 +632,29 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
upstream.sendPacket(gamerulePacket);
}
public void sendAvailableEntityIdentifiers() {
NbtMap nbt = Registries.BEDROCK_ENTITY_IDENTIFIERS.get();
List<NbtMap> idlist = nbt.getList("idlist", NbtType.COMPOUND);
List<EntityIdentifier> identifiers = new ArrayList<>(idlist.size());
for (NbtMap identifier : idlist) {
identifiers.add(new GeyserEntityIdentifier(identifier));
}
DefineEntitiesEvent event = new DefineEntitiesEvent(this, identifiers);
this.geyser.eventBus().fire(event);
NbtMapBuilder builder = nbt.toBuilder();
builder.putList("idlist", NbtType.COMPOUND, event.identifiers()
.stream()
.map(identifer -> ((GeyserEntityIdentifier) identifer).nbt())
.collect(Collectors.toList())
);
AvailableEntityIdentifiersPacket entityPacket = new AvailableEntityIdentifiersPacket();
entityPacket.setIdentifiers(builder.build());
upstream.sendPacket(entityPacket);
}
public void authenticate(String username) {
authenticate(username, "");
}