Skip to content

Commit c788750

Browse files
committed
Add an option to EntitySpawnDataProvider to sync data tracker at spawn
1 parent 2f5b817 commit c788750

5 files changed

Lines changed: 114 additions & 10 deletions

File tree

src/test/java/net/modificationstation/sltest/entity/EntityListener.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import net.mine_diver.unsafeevents.listener.EventListener;
44
import net.modificationstation.stationapi.api.event.entity.EntityRegister;
5+
import net.modificationstation.stationapi.api.event.registry.EntityHandlerRegistryEvent;
56
import net.modificationstation.stationapi.api.event.registry.MobHandlerRegistryEvent;
67
import net.modificationstation.stationapi.api.registry.Registry;
78

@@ -12,13 +13,14 @@ public class EntityListener {
1213

1314
@EventListener
1415
public void registerEntities(EntityRegister event) {
16+
event.register(TestEntity.class, "sltest:test");
1517
event.register(PoorGuy.class, "GPoor");
1618
}
1719

18-
// @EventListener
19-
// public void registerEntityHandlers(EntityHandlerRegistryEvent event) {
20-
// event.registry.register(Identifier.of(SLTest.MODID, "gpoor"), PoorGuy::new);
21-
// }
20+
@EventListener
21+
public void registerEntityHandlers(EntityHandlerRegistryEvent event) {
22+
Registry.register(event.registry, TestEntity.ID, TestEntity::new);
23+
}
2224

2325
@EventListener
2426
public void registerMobHandlers(MobHandlerRegistryEvent event) {
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package net.modificationstation.sltest.entity;
2+
3+
import net.minecraft.entity.Entity;
4+
import net.minecraft.entity.player.PlayerEntity;
5+
import net.minecraft.nbt.NbtCompound;
6+
import net.minecraft.world.World;
7+
import net.modificationstation.stationapi.api.server.entity.EntitySpawnDataProvider;
8+
import net.modificationstation.stationapi.api.server.entity.HasTrackingParameters;
9+
import net.modificationstation.stationapi.api.util.Identifier;
10+
11+
import static net.modificationstation.sltest.SLTest.NAMESPACE;
12+
13+
@HasTrackingParameters(trackingDistance = 20, updatePeriod = 20)
14+
public class TestEntity extends Entity implements EntitySpawnDataProvider {
15+
public static final Identifier ID = NAMESPACE.id("test");
16+
17+
public TestEntity(World world) {
18+
super(world);
19+
setBoundingBoxSpacing(0.5F, 2);
20+
}
21+
22+
public TestEntity(World world, double x, double y, double z) {
23+
this(world);
24+
method_1340(x, y + eyeHeight, z);
25+
prevX = x;
26+
prevY = y;
27+
prevZ = z;
28+
}
29+
30+
@Override
31+
protected void initDataTracker() {
32+
dataTracker.startTracking(16, 0);
33+
}
34+
35+
@Override
36+
protected void readNbt(NbtCompound nbt) {
37+
38+
}
39+
40+
@Override
41+
protected void writeNbt(NbtCompound nbt) {
42+
43+
}
44+
45+
@Override
46+
public boolean method_1356() {
47+
return true;
48+
}
49+
50+
@Override
51+
public void onPlayerInteraction(PlayerEntity player) {
52+
super.onPlayerInteraction(player);
53+
System.out.println(dataTracker.getInt(16));
54+
}
55+
56+
@Override
57+
public boolean method_1323(PlayerEntity playerEntity) {
58+
super.method_1323(playerEntity);
59+
dataTracker.set(16, dataTracker.getInt(16) + 1);
60+
return true;
61+
}
62+
63+
@Override
64+
public Identifier getHandlerIdentifier() {
65+
return ID;
66+
}
67+
68+
@Override
69+
public boolean syncTrackerAtSpawn() {
70+
return true;
71+
}
72+
}

src/test/java/net/modificationstation/sltest/item/DullPickaxeItem.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package net.modificationstation.sltest.item;
22

3+
import net.minecraft.entity.Entity;
4+
import net.minecraft.entity.EntityRegistry;
35
import net.minecraft.entity.player.PlayerEntity;
46
import net.minecraft.item.ItemStack;
57
import net.minecraft.item.ToolMaterial;
8+
import net.minecraft.world.World;
69
import net.modificationstation.stationapi.api.block.BlockState;
7-
import net.modificationstation.stationapi.api.util.Identifier;
810
import net.modificationstation.stationapi.api.template.item.TemplatePickaxeItem;
11+
import net.modificationstation.stationapi.api.util.Identifier;
12+
import net.modificationstation.stationapi.api.util.math.Direction;
913

1014
public class DullPickaxeItem extends TemplatePickaxeItem {
1115
public DullPickaxeItem(Identifier identifier) {
@@ -23,4 +27,16 @@ public boolean preMine(ItemStack itemInstance, BlockState blockState, int x, int
2327
}
2428
return false;
2529
}
30+
31+
@Override
32+
public boolean useOnBlock(ItemStack stack, PlayerEntity user, World world, int x, int y, int z, int side) {
33+
if (side != Direction.UP.ordinal()) return false;
34+
if (!world.isRemote) {
35+
Entity entity = EntityRegistry.create("sltest:test", world);
36+
entity.method_1340(x + 0.5, y + 1, z + 0.5);
37+
world.method_210(entity);
38+
}
39+
stack.bobbingAnimationTime = 20;
40+
return true;
41+
}
2642
}

station-entities-v0/src/main/java/net/modificationstation/stationapi/api/server/entity/EntitySpawnDataProvider.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,37 @@
99
import net.modificationstation.stationapi.api.network.packet.MessagePacket;
1010
import net.modificationstation.stationapi.api.util.Identifier;
1111

12+
import java.io.ByteArrayOutputStream;
13+
import java.io.DataOutputStream;
14+
1215
public interface EntitySpawnDataProvider extends StationSpawnDataProvider {
1316

1417
@Override
1518
default Packet getSpawnData() {
16-
Entity entityBase = (Entity) this;
19+
Entity entity = (Entity) this;
1720
int ownerId = 0;
18-
if (entityBase instanceof HasOwner hasOwner) {
21+
if (entity instanceof HasOwner hasOwner) {
1922
Entity owner = hasOwner.getOwner();
20-
owner = owner == null ? entityBase : owner;
23+
owner = owner == null ? entity : owner;
2124
ownerId = owner.id;
2225
}
2326
MessagePacket message = new MessagePacket(Identifier.of(StationAPI.NAMESPACE, "spawn_entity"));
2427
message.strings = new String[] { getHandlerIdentifier().toString() };
25-
message.ints = new int[] { entityBase.id, MathHelper.floor(entityBase.x * 32), MathHelper.floor(entityBase.y * 32), MathHelper.floor(entityBase.z * 32), ownerId };
28+
message.ints = new int[] { entity.id, MathHelper.floor(entity.x * 32), MathHelper.floor(entity.y * 32), MathHelper.floor(entity.z * 32), ownerId };
2629
if (ownerId > 0) {
2730
double var10 = 3.9D;
28-
message.shorts = new short[] { (short) (Doubles.constrainToRange(entityBase.velocityX, -var10, var10) * 8000), (short) (Doubles.constrainToRange(entityBase.velocityY, -var10, var10) * 8000), (short) (Doubles.constrainToRange(entityBase.velocityZ, -var10, var10) * 8000) };
31+
message.shorts = new short[] { (short) (Doubles.constrainToRange(entity.velocityX, -var10, var10) * 8000), (short) (Doubles.constrainToRange(entity.velocityY, -var10, var10) * 8000), (short) (Doubles.constrainToRange(entity.velocityZ, -var10, var10) * 8000) };
32+
}
33+
if (syncTrackerAtSpawn()) {
34+
var stream = new ByteArrayOutputStream();
35+
entity.method_1331().writeAllEntries(new DataOutputStream(stream));
36+
message.bytes = stream.toByteArray();
2937
}
3038
writeToMessage(message);
3139
return message;
3240
}
41+
42+
default boolean syncTrackerAtSpawn() {
43+
return false;
44+
}
3345
}

station-entities-v0/src/main/java/net/modificationstation/stationapi/impl/client/network/EntityClientNetworkHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ private static void handleEntitySpawn(PlayerEntity player, MessagePacket message
7070
hasOwner.setOwner(networkHandler.invokeMethod_1645(message.ints[4]));
7171
entity.method_1365((double) message.shorts[0] / 8000.0D, (double) message.shorts[1] / 8000.0D, (double) message.shorts[2] / 8000.0D);
7272
}
73+
if (message.bytes != null)
74+
entity.method_1331().writeUpdatedEntries(DataTracker.readEntries(new DataInputStream(new ByteArrayInputStream(message.bytes))));
7375
if (entity instanceof StationSpawnDataProvider provider)
7476
provider.readFromMessage(message);
7577
}

0 commit comments

Comments
 (0)