Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-11-16 04:50:08 +01:00
Go back to fast entity data list iteration and mutation
This is a fairly hot method and the array list cannot be modified outside of the already managed event cancellation and provided extra list
Dieser Commit ist enthalten in:
Ursprung
2a71612aea
Commit
4f66fd793b
@ -110,7 +110,11 @@ public abstract class EntityRewriter<C extends ClientboundPacketType, T extends
|
|||||||
public void handleEntityData(final int entityId, final List<EntityData> dataList, final UserConnection connection) {
|
public void handleEntityData(final int entityId, final List<EntityData> dataList, final UserConnection connection) {
|
||||||
final TrackedEntity entity = tracker(connection).entity(entityId);
|
final TrackedEntity entity = tracker(connection).entity(entityId);
|
||||||
final EntityType type = entity != null ? entity.entityType() : null;
|
final EntityType type = entity != null ? entity.entityType() : null;
|
||||||
for (final EntityData entityData : dataList.toArray(EMPTY_ARRAY)) { // Copy the list to allow mutation
|
|
||||||
|
// Iterate over indexed list to allow for removal and addition of elements, decrease current index and size if an element is removed
|
||||||
|
int size = dataList.size();
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
final EntityData entityData = dataList.get(i);
|
||||||
EntityDataHandlerEvent event = null;
|
EntityDataHandlerEvent event = null;
|
||||||
for (final EntityDataFilter filter : entityDataFilters) {
|
for (final EntityDataFilter filter : entityDataFilters) {
|
||||||
if (!filter.isFiltered(type, entityData)) {
|
if (!filter.isFiltered(type, entityData)) {
|
||||||
@ -125,13 +129,15 @@ public abstract class EntityRewriter<C extends ClientboundPacketType, T extends
|
|||||||
filter.handler().handle(event, entityData);
|
filter.handler().handle(event, entityData);
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
logException(e, type, dataList, entityData);
|
logException(e, type, dataList, entityData);
|
||||||
dataList.remove(entityData);
|
dataList.remove(i--);
|
||||||
|
size--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.cancelled()) {
|
if (event.cancelled()) {
|
||||||
// Remove entity data, and break current filter loop
|
// Remove entity data, and break current filter loop
|
||||||
dataList.remove(entityData);
|
dataList.remove(i--);
|
||||||
|
size--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren